题目描述
给出一棵树的中序遍历和后序遍历,请构造这颗二叉树
注意:
保证给出的树中不存在重复的节点
思路:后序遍历的最后一个元素是root
根据这个在中序遍历中可以划分左右子树的中序序列
并根据长度划分后序遍历的左右子树序列
子问题递归继续递归实现即可
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
// write code here
int size=inorder.size();//序列长度
if(size==0)
return NULL;//特殊情况
int root=postorder[size-1];//后序遍历最后一个元素是根节点
//依据根节点划分 中序遍历前后部分
vector<int> inorder_left;
int i=0;
while(inorder[i]!=root)
{
inorder_left.push_back(inorder[i]);
i++;
}
int left_size=i;
vector<int> inorder_right;
i++;
while(i<size)
{
inorder_right.push_back(inorder[i]);
i++;
}
vector<int> postorder_left;
vector<int> postorder_right;
for(int i=0;i<left_size;i++)
postorder_left.push_back(postorder[i]);
for(int i=left_size;i<size-1;i++)
postorder_right.push_back(postorder[i]);
TreeNode* p_root=new TreeNode(root);
p_root->left=buildTree(inorder_left,postorder_left);
p_root->right=buildTree(inorder_right,postorder_right);
return p_root;
}