TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty()) return nullptr;
int rootVal = preorder[0];
int mid = find(inorder.begin(), inorder.end(), rootVal) - inorder.begin();
TreeNode* root = new TreeNode(rootVal);
vector<int> leftPre(preorder.begin() + 1, preorder.begin() + 1 + mid), leftIn(inorder.begin(), inorder.begin() + mid);
vector<int> rightPre(preorder.begin() + 1 + mid, preorder.end()), rightIn(inorder.begin() + mid + 1, inorder.end());
root->left = buildTree(leftPre, leftIn);
root->right = buildTree(rightPre, rightIn);
return root;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder.length == 0) return null;
int rootVal = preorder[0];
int mid = 0; while (inorder[mid] != rootVal) mid++;
TreeNode root = new TreeNode(rootVal);
root.left = buildTree(Arrays.copyOfRange(preorder, 1, mid + 1), Arrays.copyOfRange(inorder, 0, mid));
root.right = buildTree(Arrays.copyOfRange(preorder, mid + 1, preorder.length), Arrays.copyOfRange(inorder, mid + 1, inorder.length));
return root;
}
def build_tree(preorder, inorder):
if not preorder: return None
root_val = preorder[0]
mid = inorder.index(root_val)
root = TreeNode(root_val)
root.left = build_tree(preorder[1:mid + 1], inorder[:mid])
root.right = build_tree(preorder[mid + 1:], inorder[mid + 1:])
return root
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
if (preorder.length === 0) return null;
const rootVal = preorder[0];
const mid = inorder.indexOf(rootVal);
const root = new TreeNode(rootVal);
root.left = buildTree(preorder.slice(1, mid + 1), inorder.slice(0, mid));
root.right = buildTree(preorder.slice(mid + 1), inorder.slice(mid + 1));
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
unordered_map<int, int> index;
for (int i = 0; i < (int)inorder.size(); i++) index[inorder[i]] = i;
int pre = 0;
function<TreeNode*(int, int)> build = [&](int lo, int hi) -> TreeNode* {
if (lo > hi) return nullptr;
TreeNode* root = new TreeNode(preorder[pre++]);
int mid = index[root->val];
root->left = build(lo, mid - 1);
root->right = build(mid + 1, hi);
return root;
};
return build(0, (int)inorder.size() - 1);
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
Map<Integer, Integer> index = new HashMap<>();
for (int i = 0; i < inorder.length; i++) index.put(inorder[i], i);
int[] pre = {0};
return build(preorder, index, pre, 0, inorder.length - 1);
}
private TreeNode build(int[] preorder, Map<Integer, Integer> index, int[] pre, int lo, int hi) {
if (lo > hi) return null;
TreeNode root = new TreeNode(preorder[pre[0]++]);
int mid = index.get(root.val);
root.left = build(preorder, index, pre, lo, mid - 1);
root.right = build(preorder, index, pre, mid + 1, hi);
return root;
}
def build_tree(preorder, inorder):
index = {}
for i, v in enumerate(inorder): index[v] = i
pre = 0
def build(lo, hi):
nonlocal pre
if lo > hi: return None
root = TreeNode(preorder[pre])
pre += 1
mid = index[root.val]
root.left = build(lo, mid - 1)
root.right = build(mid + 1, hi)
return root
return build(0, len(inorder) - 1)
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
const index = new Map<number, number>();
inorder.forEach((v, i) => index.set(v, i));
let pre = 0;
const build = (lo: number, hi: number): TreeNode | null => {
if (lo > hi) return null;
const root = new TreeNode(preorder[pre++]);
const mid = index.get(root.val)!;
root.left = build(lo, mid - 1);
root.right = build(mid + 1, hi);
return root;
};
return build(0, inorder.length - 1);
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty()) return nullptr;
TreeNode* root = new TreeNode(preorder[0]);
vector<TreeNode*> stack = {root};
int inIdx = 0;
for (int i = 1; i < (int)preorder.size(); i++) {
TreeNode* node = stack.back();
TreeNode* child = new TreeNode(preorder[i]);
if (node->val != inorder[inIdx]) {
node->left = child;
} else {
while (!stack.empty() && stack.back()->val == inorder[inIdx]) {
node = stack.back(); stack.pop_back();
inIdx++;
}
node->right = child;
}
stack.push_back(child);
}
return root;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder.length == 0) return null;
TreeNode root = new TreeNode(preorder[0]);
Deque<TreeNode> stack = new ArrayDeque<>(); stack.push(root);
int inIdx = 0;
for (int i = 1; i < preorder.length; i++) {
TreeNode node = stack.peek();
TreeNode child = new TreeNode(preorder[i]);
if (node.val != inorder[inIdx]) {
node.left = child;
} else {
while (!stack.isEmpty() && stack.peek().val == inorder[inIdx]) {
node = stack.pop();
inIdx++;
}
node.right = child;
}
stack.push(child);
}
return root;
}
def build_tree(preorder, inorder):
if not preorder: return None
root = TreeNode(preorder[0])
stack = [root]
in_idx = 0
for i in range(1, len(preorder)):
node = stack[-1]
child = TreeNode(preorder[i])
if node.val != inorder[in_idx]:
node.left = child
else:
while stack and stack[-1].val == inorder[in_idx]:
node = stack.pop()
in_idx += 1
node.right = child
stack.append(child)
return root
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
if (preorder.length === 0) return null;
const root = new TreeNode(preorder[0]);
const stack: TreeNode[] = [root];
let inIdx = 0;
for (let i = 1; i < preorder.length; i++) {
let node = stack[stack.length - 1];
const child = new TreeNode(preorder[i]);
if (node.val !== inorder[inIdx]) {
node.left = child;
} else {
while (stack.length > 0 && stack[stack.length - 1].val === inorder[inIdx]) {
node = stack.pop()!;
inIdx++;
}
node.right = child;
}
stack.push(child);
}
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int pre = 0;
int inn = 0;
function<TreeNode*(long long)> build = [&](long long stop) -> TreeNode* {
if (pre >= (int)preorder.size()) return nullptr;
if (inn < (int)inorder.size() && inorder[inn] == stop) {
inn++;
return nullptr;
}
TreeNode* root = new TreeNode(preorder[pre++]);
root->left = build(root->val);
root->right = build(stop);
return root;
};
return build(LLONG_MIN);
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
int[] pos = {0, 0};
return build(preorder, inorder, pos, Long.MIN_VALUE);
}
private TreeNode build(int[] preorder, int[] inorder, int[] pos, long stop) {
if (pos[0] >= preorder.length) return null;
if (pos[1] < inorder.length && inorder[pos[1]] == stop) {
pos[1]++;
return null;
}
TreeNode root = new TreeNode(preorder[pos[0]++]);
root.left = build(preorder, inorder, pos, root.val);
root.right = build(preorder, inorder, pos, stop);
return root;
}
def build_tree(preorder, inorder):
pre = 0
inn = 0
def build(stop):
nonlocal pre, inn
if pre >= len(preorder): return None
if inn < len(inorder) and inorder[inn] == stop:
inn += 1
return None
root = TreeNode(preorder[pre])
pre += 1
root.left = build(root.val)
root.right = build(stop)
return root
return build(None)
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
let pre = 0;
let inn = 0;
const build = (stop: number | null): TreeNode | null => {
if (pre >= preorder.length) return null;
if (inn < inorder.length && inorder[inn] === stop) {
inn++;
return null;
}
const root = new TreeNode(preorder[pre++]);
root.left = build(root.val);
root.right = build(stop);
return root;
};
return build(null);
}