输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
- TreeNode* Build(vector<int> pre, vector<int> in)
- {
- if(pre.size()==0) return NULL;
- else if(pre.size()==1) return new TreeNode(pre[0]);
- TreeNode* root = new TreeNode(pre[0]);
- int pos =find(in.begin(), in.end(), pre[0]) - in.begin();
- vector<int> pre_left = vector<int>(pre.begin()+1, pre.begin()+pos+1);
-
- vector<int> pre_right= vector<int>(pre.begin()+pos+1, pre.end());
-
- vector<int> in_left = vector<int>( in.begin(), in.begin()+pos);
-
- vector<int> in_right= vector<int>( in.begin()+pos+1, in.end());
- root->left = Build(pre_left, in_left);
- root->right = Build(pre_right, in_right);
- return root;
- }
思路:
递归边界:当前序为空时,返回空,当前序只有一个元素时,显然就是根结点; 递归过程:l_pre, l_in, r_pre, r_in分别表示左子树的前序和中序及右子树的前序和中序,利用它们分别对root的左子节点和右子节点进行递归调用,最后返回根结点。