重建二叉树

题目描述:

  • 输入某二叉树的前序便利和中序遍历,重建该二叉树。

思路是通过前序遍历找到根节点,然后在中序遍历中找到此节点,节点左右两边分别为左子树和右子树,通过递归重新构建

代码如下:

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
37
BinaryTreeNode* (int*preorder,int*inorder,int length){
if(preorder == NULL||inorder == NULL||length <= 0){
return NULL;
}
return ConstructCore(preorder,preorder+length-1,inorder,inorder+length-1);
}
BinaryTreeNode* ConstructCore(int *startPreorder,int*endPreorder,int*startInorder,int*endInorder){
int rootValue = startPreorder[0];
BinaryTreeNode* root = new BinaryTreeNode();
root->value = rootValue;
root->lChild = NULL;
root->rChild = NULL;
if(startPreorder == endPreorder){
if(startInorder == endInorder&&*startPreorder == *startInorder){
return root;
}
else{
throw std::exception("Invalid input.");
}
}
int *rootInorder = startInorder;
while(rootInorder <= endInorder && rootInorder->value!=rootValue){
rootInorder++;
}
if(rootInorder == endInorder && rootInorder->value!=rootValue){
throw std::exception("Invalid Input");
}
int leftLength = rootInorder - startInorder;
int *leftPreorderEnd = startPreorder + leftLength;
if(leftLength > 0){
root->left = ConstructCore(startPreorder+1,leftPreorderEnd,startInorder,rootInorder-1);
}
if(leftLength < endPreorder - startPreorder){
root->right = ConstructCore(leftPreorderEnd+1,endPreorder,rootInorder+1,endInorder);
}
return root;
}