# 106. 从中序与后序遍历序列构造二叉树
# 题目
根据一棵树的中序遍历与后序遍历构造二叉树。
注意: 你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 题解
# 递归
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {number[]} inorder
* @param {number[]} postorder
* @return {TreeNode}
*/
var buildTree = function(inorder, postorder) {
if (!postorder.length) return null;
let root = new TreeNode(postorder[postorder.length - 1]);
let i = 0;
for (; i < inorder.length; ++i) {
if (inorder[i] == root.val) {
break;
}
}
root.left = buildTree(inorder.slice(0, i), postorder.slice(0, i));
root.right = buildTree(inorder.slice(i + 1), postorder.slice(i, -1));
return root;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 迭代
var buildTree = function(inorder, postorder) {
if (postorder.length == 0) {
return null;
}
const root = new TreeNode(postorder[postorder.length - 1]);
const stack = [];
stack.push(root);
let inorderIndex = inorder.length - 1;
for (let i = postorder.length - 2; i >= 0; i--) {
let postorderVal = postorder[i];
let node = stack[stack.length - 1];
if (node.val !== inorder[inorderIndex]) {
node.right = new TreeNode(postorderVal);
stack.push(node.right);
} else {
while (
stack.length &&
stack[stack.length - 1].val === inorder[inorderIndex]
) {
node = stack.pop();
inorderIndex--;
}
node.left = new TreeNode(postorderVal);
stack.push(node.left);
}
}
return root;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28