【题目描述】
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
【思路】
利用递归,每一轮递归中找到当前根节点并返回;至于根节点的左右子节点就根据递归得到,找到前序序列pre与中序序列tin所对应二叉树的根节点(pre[0])之后,再根据tin就能够确定左子树前序序列preleft与中序序列tinleft和右子树的前序序列preright与中序序列tinright,作为递归的参数即可。
【代码】
C++:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
int length=pre.size();
if (length==0){
return NULL;
}
TreeNode* head=new TreeNode(pre[0]);
int head_index=0;
for(int i=0;i<length;i++){
if(vin[i]==pre[0]){
head_index=i;
break;
}
}
vector<int> preleft,preright,vinleft,vinright;
for(int i=0;i<head_index;i++){
preleft.push_back(pre[i+1]);
vinleft.push_back(vin[i]);
}
for(int i=head_index+1;i<length;i++){
preright.push_back(pre[i]);
vinright.push_back(vin[i]);
}
head->left=reConstructBinaryTree(preleft,vinleft);
head->right=reConstructBinaryTree(preright,vinright);
return head;
}
};
Python:
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
length=len(pre)
if length==0:
return None
head=TreeNode(pre[0])
head_index=tin.index(pre[0])
pre_left=pre[1:head_index+1]
tin_left=tin[0:head_index]
pre_right=pre[head_index+1:]
tin_right=tin[head_index+1:]
head.left=self.reConstructBinaryTree(pre_left,tin_left)
head.right=self.reConstructBinaryTree(pre_right,tin_right)
return head