题目:
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
思路:后序数组尾元素是根节点,根据根节点可以在中序数组中找到其左右子树长度,若右子树存在,那么后序数组中尾元素前一个元素就是其右孩子,若左子树存在,那么从尾元素向前移动"右子树长度"个位置的节点就是其左孩子。递归上述过程直到所有节点都被插入树中。
//用来记录中序遍历中各个元素的下标
map<int,int> Index;
TreeNode* buildTree(vector<int> pos,int point,vector<int> in,int left,int right)
{
if(left>right)
return NULL;
TreeNode* root = new TreeNode(pos[point]);
int index = Index[pos[point]];
//右子树长度
int rlen = right-index;
//为根节点左右孩子赋值
root->left = buildTree(pos,point-rlen-1,in,left,index-1);
root->right = buildTree(pos,point-1,in,index+1,right);
return root;
}
TreeNode* buildTree(vector<int>& inorder,vector<int>& postorder)
{
int len = inorder.size();
if(len==0)
return NULL;
for(int i=0;i<len;i++)
Index[inorder[i]] = i;
return buildTree(postorder,len-1,inorder,0,len-1);
}