重新构建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
//判断两个向量大小是否相等
if(preorder.size() != inorder.size())
return NULL;
int length = preorder.size();
//传入首尾的索引
return constructTree(preorder,0,length-1,inorder,0,length-1);

}
TreeNode* constructTree(vector<int>& preorder,int ps, int pend,vector<int>& inorder ,int is,int iend){
//边界值判断 超出就表示没有左右树了。
if(ps>pend || is>iend)
return NULL;
TreeNode *root = new TreeNode(preorder[ps]);
int irootpos;
for(int i=is;i<=iend;i++){
if(inorder[i] == root->val){
irootpos = i;
break;
}
}
//获取中序的左边的长度 表示左子树的大小
int leftlength = irootpos - is;
//获取中序的右边的长度 表示右子树的大小
int rightlength = iend - irootpos;
//进入递归
root->left = constructTree(preorder,ps+1,ps+leftlength,inorder,is,irootpos-1);
root->right = constructTree(preorder,pend-rightlength+1,pend,inorder,irootpos+1,iend);
//返回根节点
return root;

}

};

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×