给出一棵树的先序遍历和中序遍历,重建出整棵树。
思路
先序遍历的第一个值是根节点,在中序遍历序列里根节点左边是左子树,右边是右子树。中序遍历里得到左子树的长度在先序遍历里确定左子树,这样又得到了左子树的先序遍历和中序遍历,以此类推得到递归树。
map<int,int> Save;///后续列表的元素索引,根据元素可以很快得到索引。
TreeNode*Build(vector<int>&preorder,int Leftstart,int Leftend,
vector<int> &inorder,int Rightstart,int Rightend,map<int,int>&Save)
{
if(Leftstart>Leftend)
{
return null;
}
int val = preorder[Leftstart];
TreeNode*root = new TreeNode(val);
if(Leftstar==Leftend)
{
return root;
}
else
{
int middle = Save[val];
int leftLength= middle - Rightstart;
int rightLength = Rightend - middle;
TreeNode *left = Build(preorder,Leftstart+1,LeftLength+Leftstart,inorder,rightstart,middle-1,map);
TreeNode *right = Build(preorder,Leftend-rightLength+1,Leftend,inorder,middle+1,Rightend,map);
root->left = left;
root->right = right;
return root;
}
}