从中序与后序遍历序列构造二叉树

题目:

根据一棵树的中序遍历与后序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:

    3
    / \
  9  20
      /  \
   15   7

思路:后序数组尾元素是根节点,根据根节点可以在中序数组中找到其左右子树长度,若右子树存在,那么后序数组中尾元素前一个元素就是其右孩子,若左子树存在,那么从尾元素向前移动"右子树长度"个位置的节点就是其左孩子。递归上述过程直到所有节点都被插入树中。

//用来记录中序遍历中各个元素的下标 
map Index; 
TreeNode* buildTree(vector pos,int point,vector 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& inorder,vector& postorder) 
{
	int len = inorder.size();
    if(len==0)
		return NULL;
	for(int i=0;i

你可能感兴趣的:(LeetCode之二叉树)