题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
分析:
前序遍历的特点是,开头的是父节点! 那么就可以利用前序遍历的第一个节点,把中序遍历分割为左,右两段,再通过左,右的长度,反过来把前序遍历的序列也分割为两段。。。。再把左,右两段递归分割下去,直到叶节点为止。
实现代码:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {if(pre.size()<=0)return NULL;TreeNode*root ;reConstructBinaryTree( root,pre, 0, pre.size()-1,vin, 0, vin.size()-1 ) ;return root;}void reConstructBinaryTree(TreeNode* &root,vector<int>&pre,int i,int j,vector<int>&vin,int m,int n ) {if(i>j || m>n)return;root = new TreeNode(pre[i]);if(i==j || m==n)return;int pix = pre[i];int k = 0;for(k = m;k<=n;k++ ){if(vin[k] == pix){break;}}int left_num = k-m;int right_num = n-k;reConstructBinaryTree(root->left,pre, i+1, i+left_num ,vin, m, k-1 );reConstructBinaryTree(root->right,pre, j-right_num+1, j,vin, k+1, n );}