根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
一、思路
思路与前序遍历很相似:LeetCode105-从前序与中序遍历序列构造二叉树
C++代码:
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return generateTree(0, inorder.size(), 0, postorder.size(), inorder, postorder);
}
TreeNode* generateTree(int in_begin, int in_end, int post_begin, int post_end, vector<int>& inorder, vector<int>& postorder) {
if (in_begin >= in_end || post_begin >= post_end)
return NULL;
int left_begin_in, left_end_in, left_begin_post, left_end_post;
int right_begin_in, right_end_in, right_begin_post, right_end_post;
int root_in = in_begin, root_post = post_end - 1;
TreeNode* root = new TreeNode(postorder[root_post]);
while (root_in < in_end && inorder[root_in] != postorder[root_post])
root_in++;
left_begin_in = in_begin;
left_end_in = root_in;
right_begin_in = root_in + 1;
right_end_in = in_end;
int left = left_end_in - left_begin_in, right = right_end_in - right_begin_in;
right_end_post = root_post;
right_begin_post = right_end_post - right;
left_begin_post = post_begin;
left_end_post = left_begin_post + left;
root->left = generateTree(left_begin_in, left_end_in, left_begin_post, left_end_post, inorder, postorder);
root->right = generateTree(right_begin_in, right_end_in, right_begin_post, right_end_post, inorder, postorder);
return root;
}
};
执行效率: