剑指offer系列4---重建二叉树

【题目】

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

 1 package com.exe1.offer;
 2 
 3 /**
 4  * 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
 5  * 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
 6  * 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
 7  * @author WGS
 8  *
 9  */
10 public class ConstructBinaryTree {
11     //定义一个树
12     public class TreeNode{
13         int val;
14         TreeNode left;
15         TreeNode right;
16         
17         TreeNode(int n){
18             val=n;
19         }
20     }
21     //新建一个方法,返回重建的二叉
22     public TreeNode returnConstructBinaryTree(int[] preTree,int[] inTree){        
23         return constructCore(preTree,0,preTree.length-1,inTree,0,inTree.length-1);
24     }
25     
26     public TreeNode constructCore(int[] preTree,int startPreOrder,int endPreOrder,int[] inTree,int startInOrder,int endInOrder ){
27         //根据前序遍历序列得到根节点的值
28         int rootValue=preTree[startPreOrder];
29         //创建一个只有根结点的二叉树
30         TreeNode rootNode=new TreeNode(rootValue);
31         rootNode.left=null;
32         rootNode.right=null;
33         //只有一个结点,那么该结点即使根结点,直接返回
34         if(startPreOrder==endPreOrder){
35             if(startInOrder==endInOrder&&preTree[startPreOrder]==inTree[startInOrder]){
36                 return rootNode;
37             }
38         }
39         
40         //根据中序遍历,从中序遍历序列起点开始搜寻根结点位置
41         int rootOfInTree=startInOrder;
42         while(rootOfInTree<=endInOrder&&inTree[rootOfInTree]!=rootValue){
43             rootOfInTree++;
44         }
45         
46         //异常处理:中序序列中找不到这样的根结点
47         while(rootOfInTree==endInOrder&&inTree[rootOfInTree]!=rootValue){
48             return null;
49         }
50         
51         //计算左子树的长度
52         int leftSubTreeLen=rootOfInTree-startInOrder;
53          //根据左子树的长度计算前序遍历结果中左子树的最后一个结点的下标
54         int leftInOrderOfPreOrderEnd=startPreOrder+leftSubTreeLen;
55         
56         //重建左子树
57         if(leftSubTreeLen>0){
58             rootNode.left=constructCore(preTree,startPreOrder+1,leftInOrderOfPreOrderEnd,inTree,startInOrder,rootOfInTree-1);
59         }
60         //重建右子树
61         if(leftSubTreeLen<endPreOrder-startPreOrder){
62             rootNode.right=constructCore(preTree,leftInOrderOfPreOrderEnd-1,endPreOrder,inTree,rootOfInTree+1,endInOrder);
63         }
64         return rootNode;
65         
66     }
67     
68     public static void main(String [] args){
69         int[] preTree={1,2,4,7,3,5,6,8};
70         int[] inTree={4,7,2,1,5,3,8,6};
71         TreeNode root=new ConstructBinaryTree().returnConstructBinaryTree(preTree, inTree);
72         System.out.println(root);//返回二叉树,此处无法打印,该怎么遍历还不会。
73     }
74     
75 }
原文地址:https://www.cnblogs.com/noaman/p/5372273.html