码迷,mamicode.com
首页 > 其他好文 > 详细

第3章 结构之法——重建二叉树

时间:2015-07-17 00:00:44      阅读:441      评论:0      收藏:0      [点我收藏+]

标签:

重建二叉树

问题描述

技术分享

技术分享

分析与解法

技术分享

技术分享

技术分享

用java实现的代码如下:

 1 package chapter3jiegouzhifa.RebuildBinTree;
 2 
 3 /**
 4  * 重建二叉树
 5  * 递归解法
 6  * @author DELL
 7  *
 8  */
 9 public class RebuildBinTree {
10     //定义节点类
11     public static class Node{
12         int left;  //左子树位置
13         int right;  //右子树位置
14         char value;  //节点值
15         public Node(int left, int right, char value){
16             this.left = left;
17             this.right = right;
18             this.value = value;
19         }
20         public void setLeft(int left) {
21             this.left = left;
22         }
23         public void setRight(int right) {
24             this.right = right;
25         }
26     }
27     /**
28      * 重建二叉树
29      * @param preOrder 前序遍历结果
30      * @param inOrder    中序遍历结果
31      * @param tree    重建的树
32      * @param root  当前重建树的根节点位置
33      */
34     public static void rebuild(String preOrder, String inOrder, Node[] tree, int root){
35         
36         int nTreeLen = preOrder.length();
37         //检查边界条件
38         if(preOrder.length()==0||inOrder.length()==0)
39             return ;
40         //获取当前遍历的第一个节点
41         Node temp = new Node(-1,-1,preOrder.charAt(0));
42         //如果节点为空,把当前节点复制到根节点
43         if(tree[root]==null){
44             tree[root] = temp;
45         }
46         //如果当前树的长度为1,那么已经是最后一个节点
47         if(nTreeLen == 1){    
48             return ;
49         }
50         //寻找左子树的结尾
51         int i=0;
52         while(inOrder.charAt(i)!=temp.value&&i<nTreeLen){
53             i++;
54         }
55 //        System.out.println(i);
56         //重建左子树
57         int index = root;
58         if(i>0){
59             tree[index].setLeft(++root);
60             Node left = new Node(-1,-1,preOrder.charAt(1));
61             tree[root]=left;
62 //            System.out.println(preOrder.substring(1,i+1)+" "+i);
63             rebuild(preOrder.substring(1,i+1),inOrder.substring(0, i),tree,root);
64         }
65         //重建右子树
66         if(nTreeLen-i-1>0){
67             tree[index].setRight(root+i);
68             Node right = new Node(-1,-1,preOrder.charAt(i+1));
69             tree[root+i] = right;
70             rebuild(preOrder.substring(i+1,nTreeLen),inOrder.substring(i+1, nTreeLen),tree,root+i);
71         }
72     }
73     public static void main(String[] args) {
74         String preOrder = "abdcef";
75         String inOrder = "dbaecf";
76         Node[] tree = new  Node[preOrder.length()];
77         rebuild(preOrder,inOrder,tree,0);
78         System.out.println("重建的树为:");
79         for(int i=0;i<tree.length;i++){
80             String left,right;
81             if(tree[i].left!=-1)
82                 left = String.valueOf(tree[tree[i].left].value);
83             else
84                 left = null;
85             if(tree[i].right!=-1)
86                 right = String.valueOf(tree[tree[i].right].value);
87             else
88                 right = null;
89             System.out.println(tree[i].value+" 左子树:"+left+" 右子树:"+right);
90         }
91     }
92     
93 }

程序运行结果如下:

重建的树为:
a 左子树:b 右子树:c
b 左子树:d 右子树:null
d 左子树:null 右子树:null
c 左子树:e 右子树:f
e 左子树:null 右子树:null
f 左子树:null 右子树:null

 

第3章 结构之法——重建二叉树

标签:

原文地址:http://www.cnblogs.com/gaopeng527/p/4652640.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!