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


    重建二叉树

    问题描述

    分析与解法

    用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
  • 相关阅读:
    从属性赋值到MVVM模式详解
    C#综合揭秘——细说事务
    Action与Trigger
    C#综合揭秘——细说多线程(下)
    继承BitmapSource并使用独立存储来缓存远程的图片
    Windows Phone 7 MVVM模式数据绑定和传递参数
    Lambda表达式总结
    Windows Phone页面导航和独立存储开发总结
    RegisterHotKey设置系统级热键《转》
    隐藏统计代码或者任何不想被看见的东西《转》
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4652640.html
Copyright © 2020-2023  润新知