题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路分析
前序遍历的顺序是 根->左孩子节点->右孩子节点,中序遍历的顺序是 左孩子节点->根->右孩子节点,通过前序遍历确定根的值,接着把遍历数组可以划分成两个部分,进行递归求解:
- 通过前序遍历数组的第一个节点确定根的值,并且进行返回;
- 此节点的左孩子节点由左子树前序遍历序列与左子树中序遍历序列进行确定;
- 此节点的右孩子节点由右子树前序遍历序列与右子树中序遍历序列进行确定;
- 上述划分实际上就是分而治之,进行递归求解;
public class Solution{
public TreeNode reConstructBinaryTree(int[] pre,int[] in){
//调用执行函数,方便进行递归
return fun(pre,0,pre.length - 1,in,0,in.length - 1);
}
public TreeNode fun(int[] pre,int pre_fir,int pre_end,int[] in,int in_fir,int in_end){
if(pre_fir > pre_end || in_fir > in_end){
return null;
}
int index = in_fir;
while(in[index] != pre[pre_fir]){
index++;
}
TreeNode res = new TreeNode(pre[pre_fir]);
//对于节点的左右子树进行构造
res.left = fun(pre,pre_fir + 1,pre_fir + index - in_fir,in,in_fir,index-1);
res.right = fun(pre,pre_fir + index - in_fir+1,pre_end,in,index+1,in_end);
return res;
}
}