Pro 6 重建二叉树(java)

注:(1)java中树的构建

(2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的

 1 package com.xsf.SordForOffer;
 2 
 3 import java.util.Arrays;
 4 
 5 /*剑指offer第6个问题
 6  根据前序和中序遍历来重建二叉树
 7  */
 8 class BinaryTreeNode {
 9     public int value;
10     public BinaryTreeNode leftNode;
11     public BinaryTreeNode rightNode;
12 }
13 
14 class ConstructCore {
15     /*
16      * 输入二叉树的前序遍历和中序遍历结果,重建二叉树并输出头节点 ex:12473568,47215386
17      */
18     public BinaryTreeNode constructCore(int[] preorder, int[] inorder)
19             throws Exception {
20         
21         if (preorder == null || inorder == null) {
22             return null;
23         }
24         if (preorder.length != inorder.length) {
25             throw new Exception("长度不一样-非法输入");
26         }
27         BinaryTreeNode root = new BinaryTreeNode();
28         for (int i = 0; i < inorder.length; i++) {
29             if (inorder[i] == preorder[0]) {
30                 // isHave = true;
31                 root.value = inorder[i];
32                 root.leftNode = constructCore(
33                         Arrays.copyOfRange(preorder, 1, i + 1),
34                         Arrays.copyOfRange(inorder, 0, i));
35                 root.rightNode = constructCore(
36                         Arrays.copyOfRange(preorder, i + 1, preorder.length),
37                         Arrays.copyOfRange(inorder, i + 1, inorder.length));
38             }
39         }
40         
41         return root;
42     }
43 
44     public void lastOrderTraverse(BinaryTreeNode T) {
45         if (T != null) {
46             lastOrderTraverse(T.leftNode);
47             lastOrderTraverse(T.rightNode);
48             System.out.print(T.value);
49         }
50     }
51 }
52 
53 public class Pro6Biconstruct {
54     public static void main(String[] args) throws Exception {
55         ConstructCore test = new ConstructCore();
56         int[] pre = { 1, 2, 4 };
57         int[] in = { 2, 1, 4 };
58         BinaryTreeNode root = test.constructCore(pre, in);
59         test.lastOrderTraverse(root);
60     }
61 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。