leetcode解题: Construct Binary Tree from Inorder and Postorder Traversal (106)

Given inorder and postorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

解法1:

首先回想一下inorder和postorder的遍历顺序是什么样的。 inorder是left,root,right。 postorder是left,right,root。 那么发现postorder对应的最后一个数就是tree的root, 当我们找到乐root之后就可以在inorder里面找到root的位置,假设为i。
按照inorder的顺序,在i左面的都是root的左节点,而在i右面的都是root的右节点。
对于左右子树,我们只要在运行一次同样的算法,只是更新一下取值的范围(左右边界)就可以了。
C++

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if (inorder.empty()) {
return NULL;
}
return helper(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
}
TreeNode* helper(vector<int>& inorder, int istart, int iend, vector<int>& postorder, int pstart, int pend) {
if (istart > iend) {
return NULL;
}
if (istart == iend) {
TreeNode* node = new TreeNode(inorder[istart]);
return node;
}
int val = postorder[pend];
TreeNode* root = new TreeNode(val);
auto iter = find(inorder.begin(), inorder.end(), val);
int index = iter - inorder.begin();
int leftNum = index - istart;
int rightNum = iend - index;
// Find left tree
TreeNode* left = helper(inorder, istart, index - 1, postorder, pstart, pstart + leftNum - 1);
// Find right tree
TreeNode* right = helper(inorder, index + 1, iend, postorder, pstart + leftNum, pstart + leftNum + rightNum - 1);
root->left = left;
root->right = right;
return root;
}
};

Java

1