题目描述
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
样例
算法1
常规题:只是之前老不知道怎么确定左右子树在后序遍历中的边界,这次知道怎么算了
C++ 代码
/**
* 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) {
return pre_order(0, inorder.size() - 1, 0, inorder.size() - 1, inorder, postorder);
}
TreeNode *pre_order(int leftin, int rightin, int leftpost, int rightpost, vector<int> &in, vector<int> &post) {
if (leftin > rightin) return NULL;
TreeNode *root = new TreeNode(post[rightpost]);
int rootin = leftin;
while (rootin <= rightin && in[rootin] != post[rightpost]) rootin++;
//在中序遍历中计算左子树的数量
int left = rootin - leftin;
//后序左子树的边界【left,leftpost+left-1】
root->left = pre_order(leftin, rootin - 1, leftpost, leftpost + left - 1, in, post);
//后序右子树的边界【leftpost+left,rightpost - 1】
root->right = pre_order(rootin + 1, rightin, leftpost + left, rightpost - 1, in, post);
return root;
}
};