题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:
前序顺序:(中左右),中序顺序:(左中右),后序顺序:(左右中)
如题中,
前序遍历序列{1,2,4,7,3,5,6,8},可以得出1为树的根。从中序遍历序列{4,7,2,1,5,3,8,6}可以得出{4,7,2}是以1为根的树的左子树,{5,3,8,6}是以1为根的右子树。
同理,通过前序序列{2,4,7}可以得出2为左子树的根部,通过中序序列{4,7,2}可以得出{4,7}为以2为根部的树的左子树,可以看出以2为根部的树没有右子树。递归进行就可,其它都是同理。
代码:
package offer;
public class TestNo4 {
static class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x){
val = x;
}
}
public static void main(String[] args) {
}
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre == null || in == null || pre.length != in.length||pre.length<1){
return null;
}
//递归调用
TreeNode root = reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
return root;
}
private static TreeNode reConstructBinaryTree(int[] pre,int startPre,int endPre,int[] in,int startIn,int endIn){
if(startPre >endPre || startIn > endIn){
return null;
}
//根节点为前序序列数组的第一个元素
TreeNode root = new TreeNode(pre[startPre]);
for(int i = 0;i<=endIn;i++){
//根据前序遍历得到的根节点在中序遍历中查找根节点的下标i
if(pre[startPre] == in[i]){
//进行递归调用
root.left = reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
root.right= reConstructBinaryTree(pre,startPre+i-startIn+1,endPre,in,i+1,endIn);
break;
}
}
return root;
}
}