程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 劍指offer編程題Java實現——面試題6重建二叉樹

劍指offer編程題Java實現——面試題6重建二叉樹

編輯:關於JAVA

劍指offer編程題Java實現——面試題6重建二叉樹。本站提示廣大學習愛好者:(劍指offer編程題Java實現——面試題6重建二叉樹)文章只能為提供參考,不一定能成為您想要的結果。以下是劍指offer編程題Java實現——面試題6重建二叉樹正文


題目:

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷結果中都不含重復的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建出二叉樹並輸出他的根節點。

在二叉樹的前序遍歷中,第一個數字總是樹的根節點。在中序遍歷中,樹的根節點在序列的中間,左子樹的節點的值位於根節點的左邊,右子樹節點的值位於根節點值的右邊。

因此需要掃描中序遍歷序列才能找到很結點的值,由此可以找到左子樹的節點的個數和右子樹節點的個數,然後在前序遍歷序列中找到左子樹的根節點,再到中序遍歷序列中找到左子樹的左子樹和右子樹。依次遞歸。由於二叉樹的構造本身就是用遞歸實現的,所以重建二叉樹也用遞歸進行實現實很簡單的。

 1 package Solution;
 2 
 3 /**
 4  * 劍指offer面試題6:重構二叉樹
 5  * 題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷結果中都不含重復的數字。
 6  * 例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建出下圖的二叉樹並輸出他的根節點。
 7  *                     1
 8  *                   /   \
 9  *                  2     3
10  *                 /     / \
11  *                4     5   6
12  *                 \        /
13  *                 7        8
14  * @author GL
15  *
16  */
17 public class No6ReConstructBinaryTree {
18 
19     public static void main(String[] args) {
20         int[] preOrder={1,2,4,7,3,5,6,8};
21         int[] inOrder={4,7,2,1,5,3,8,6};
22         BinaryTreeNode node=reConstruct(preOrder,inOrder);
23         printTree(node);
24     }
25     //二叉樹節點
26     public static class BinaryTreeNode{
27         int value;
28         BinaryTreeNode left;
29         BinaryTreeNode right;
30     }
31     
32     /**
33      * 判斷輸入合法性
34      * @param preOrder
35      * @param inOrder
36      * @return
37      */
38     public static BinaryTreeNode reConstruct(int[] preOrder,int[] inOrder){
39         if(preOrder==null||inOrder==null||preOrder.length!=inOrder.length||preOrder.length<1)
40             return null;
41         return construct(preOrder,0,preOrder.length-1,inOrder,0,inOrder.length-1);
42     }
43     
44     /**
45      * 根據前序遍歷和中序遍歷構建二叉樹
46      * @param preOrder    前序遍歷序列
47      * @param ps        前序遍歷開始位置
48      * @param pe        前序遍歷結束位置
49      * @param inOrder    中序遍歷序列
50      * @param is        中序遍歷開始位置
51      * @param ie        中序遍歷結束位置
52      * @return            構建的樹的根節點
53      */
54     public static BinaryTreeNode construct(int[] preOrder,int ps,int pe,int[] inOrder,int is,int ie){
55         //開始位置大於結束位置說明已經處理到葉節點了
56         if(ps>pe)
57             return null;
58         ///前序遍歷第一個數字為當前的根節點
59         int value=preOrder[ps];
60         //index為根節點在中序遍歷序列中的索引
61         int index=is;
62         while(index<=ie&&inOrder[index]!=value){
63             index++;
64         }
65         System.out.println("當前各參數的數值為->ps:"+ps+" pe:"+pe+" is:"+is+" ie:"+ie+" index:"+index+" rootValue:"+value);
66         //如果在整個中序遍歷中沒有找到根節點說明輸入的數據是不合法的
67         if(index>ie){
68             throw new RuntimeException("invalid input"+index);
69         }
70         BinaryTreeNode node=new BinaryTreeNode();
71         node.value=value;
72         //當前節點的左子樹的個數為index-is
73         //左子樹對應的前序遍歷的位置在preOrder[ps+1,ps+index-is]
74         //左子樹對應的中序遍歷的位置在inOrder[is,index-1]
75         node.left=construct(preOrder,ps+1,ps+index-is,inOrder,is,index-1);
76         //當前節點的右子樹的個數為ie-index
77         //右子樹對應的前序遍歷位置在preOrder[ps+index-is+1,pe]
78         //右子樹對應的中序遍歷位置在inOrder[index+1,ie]
79         node.right=construct(preOrder,ps+index-is+1,pe,inOrder,index+1,ie);
80         return node;
81     }
82     //中序遍歷遞歸打印
83     public static void printTree(BinaryTreeNode node){
84         if(node!=null){
85             printTree(node.left);
86             System.out.print(node.value+" ");
87             printTree(node.right);
88         }
89     }
90     
91 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved