题目描述:
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
根据一个二叉树的中序结果和后序结果,重建二叉树。(注意:此二叉树中没有相同的元素)
解题思路:
我们知道中序的顺序是:左孩子---根---右孩子,后序的顺序是:左孩子---右孩子---根,所以我们可以确认,后序的最后一个元素一定是这棵二叉树的根结点(重建二叉树,是必须知道二叉树的中序的),我们拿着找到的根结点,去中序里找到根结点,根据中序的顺序特性,我们确定在根结点前的元素一定是这棵树的左子树,根结点后面的元素一定是这棵树的右子树,此时,我们将这个大问题转换成了两个小问题(子问题思想),我们只需要解决左子树的问题和右子树的问题即可,不难发现左右子树的处理方法和前面的思想是一样的,我们通过递归调用原函数即可实现即可实现
/**
* Definition for binary tree
* 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 buildTree(inorder,0,inorder.size()-1,postorder,0,postorder.size()-1);
}
TreeNode *buildTree(vector<int> &inorder,int nleft,int nright,vector<int> &postorder,int mleft,int mright)
{
if(nleft>nright || mleft>mright)
return NULL;
TreeNode *Cur = new TreeNode(postorder[mright]);
int i = 0;
//遍历中序,找到树的根结点
for(i=nleft;i<inorder.size();i++){
if(inorder[i] == Cur->val)
break;
}
//此时,分别递归处理左子树和右子树
//注意递归只能postorder的index处理
//我们只要牢记i-nleft是inorder中根结点到左边起始点的距离
//那么在postorder中,左子树应该就是mleft+i-nleft-1
Cur->left = buildTree(inorder,nleft,i-1,postorder,mleft,mleft+i-nleft-1);
Cur->right = buildTree(inorder,i+1,nright,postorder,mleft+i-nleft,mright-1);
return Cur;
}
};