Problem :
Given inorder and postorder traversal of a tree, construct the binary tree.
Example:
**
Algorithm:
**
已知的二叉树的中序遍历和后序遍历,构造二叉树。
图1
以图1为例,
中序遍历:DBEAFC
后序遍历:DEBFCA
可以发现后序遍历的最后一个节点是根节点,而在中序遍历中,这个A节点分割了A的左子树和右子树,也可以得到左子树的节点数。
而在后序遍历中,是先遍历左子树,再遍历右子树,然后才是本身,所以根据在中序遍历得到的左子树的节点数可以帮助得到左子树的后序遍历。
由此,我们又分别得到了根节点左又子树的后序遍历和中序遍历。就可以用递归得到所有的节点。
**
Code:
**
/**
* 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* getchild(vector<int>& inorder,int begin1,int end1,vector<int>& postorder,int begin2,int end2)
{
if(begin1>end1)
return NULL;
TreeNode* root=new TreeNode(postorder[end2]);
int index;
for(int i=begin1;i<=end1;i++)
{
if(inorder[i]==postorder[end2])
{
index=i;
break;
}
}
int length=index-begin1;
root->left=getchild(inorder,begin1,index-1,postorder,begin2,begin2+length-1);
root->right=getchild(inorder,index+1,end1,postorder,begin2+length,end2-1);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int s=inorder.size();
if(s==0)
return NULL;
TreeNode* root=getchild(inorder,0,s-1,postorder,0,s-1);
return root;
}
};