题目:Given preorder and inorder traversal of a tree, construct the binary tree.
根据前序遍历和中序遍历构造出原来的二叉树。
思路是根据前序遍历的特点可知,其第一个元素就是树的根节点,然后在中序遍历中找到该节点,又由中序遍历的性质可知,在该节点前面的元素全都在这个节点的左子树内,后面的元素都在右子树内,这样就将中序序列一分为二,又可在前序序列重复刚才步骤,如此递归即可完成重建。
TreeNode * precenTotree(vector<int> &pre, vector<int> &cen, int begin, int &mid, int end)
{
TreeNode *root=NULL;
if(begin>end-1)
return root;
int i=begin;
for(; i<end; i++)
if( cen[i] ==pre[mid] ) break; //在cen中找到pre的元素
if(i==end) return root ; //没找到返回
root=new TreeNode(pre[mid]); //以前序节点为根根节点
mid++; //指向前序的下一个元素
root->left=precenTotree(pre, cen, begin, mid, i);
root->right=precenTotree(pre, cen, i+1, mid, end);
return root;
}
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder)
{
int mid=0;
return precenTotree(preorder, inorder, 0, mid, preorder.size());
}