zoukankan      html  css  js  c++  java
  • Java学习笔记之数据结构中的树

    数据结构中二叉树的代码如下:

      1 package tech2;
      2 
      3 public class BTNode<E> {
      4     private E data;
      5     private BTNode<E> left;
      6     private BTNode<E> right;
      7 
      8     public BTNode(E root) {
      9         data = root;
     10     }
     11 
     12     /**
     13      * BTNode<E> 的构造函数
     14      * 
     15      * @param data
     16      *            结点
     17      * @param left
     18      *            左子树
     19      * @param right
     20      *            右子树
     21      */
     22     public BTNode(E data, BTNode<E> left, BTNode<E> right) {
     23         this.data = data;
     24         this.left = left;
     25         this.right = right;
     26     }
     27 
     28     // get 和 set 方法
     29     public E getData() {
     30         return data;
     31     }
     32 
     33     public void setData(E data) {
     34         this.data = data;
     35     }
     36 
     37     public BTNode<E> getLeft() {
     38         return left;
     39     }
     40 
     41     public void setLeft(BTNode<E> left) {
     42         this.left = left;
     43     }
     44 
     45     public BTNode<E> getRight() {
     46         return right;
     47     }
     48 
     49     public void setRight(BTNode<E> right) {
     50         this.right = right;
     51     }
     52 
     53     public boolean isLeaf() {
     54         return (left == null) && (right == null);
     55     }
     56 
     57     /**
     58      * 查找从本结点开始的最左结点的数据
     59      * 
     60      * @return
     61      */
     62     public E getLeftmostData() {
     63         if (left == null)
     64             return data;
     65         else
     66             return left.getLeftmostData();
     67     }
     68 
     69     public E getRightmostData() {
     70         if (right == null)
     71             return data;
     72         else
     73             return right.getRightmostData();
     74     }
     75 
     76     /**
     77      * 删除最左结点的方法,当删除时最左结点不可能有两个孩子,否则就递归到下一个了
     78      * 
     79      * @return 返回的是比原来小的树的根节点的引用
     80      */
     81     public BTNode<E> removeLeftmost() {
     82         if (left == null)
     83             return right; // 最右边的结点在根处,因为没有左孩子
     84         else {
     85             left = left.removeLeftmost(); // 从这里开始递归了
     86             return this; // 到这里是完成,并且返回
     87         }
     88     }
     89 
     90     public BTNode<E> removeRightmost() {
     91         if (right == null)
     92             return right;
     93         else {
     94             right = right.removeRightmost();
     95             return this;
     96         }
     97     }
     98 
     99     /**
    100      * 递归复制一个树
    101      * 
    102      * @param source
    103      *            要被复制的树
    104      * @return 返回的是一个新树的对象
    105      */
    106     public static <E> BTNode<E> treeCopy(BTNode<E> source) {
    107         BTNode<E> leftCopy, rightCopy;
    108         if (source == null)
    109             return null;
    110         else {
    111             leftCopy = treeCopy(source.left);
    112             rightCopy = treeCopy(source.right);
    113             return new BTNode<E>(source.data, leftCopy, rightCopy);
    114         }
    115     }
    116 
    117     /**
    118      * 前序遍历
    119      */
    120     public void preorderPrint() {
    121         System.out.println(data);
    122         if (left != null)
    123             left.preorderPrint();
    124         if (right != null)
    125             right.preorderPrint();
    126     }
    127 
    128     /**
    129      * 中序遍历
    130      */
    131     public void inorderPrint() {
    132         if (left != null)
    133             left.inorderPrint();
    134         System.out.println(data);
    135         if (right != null)
    136             right.inorderPrint();
    137     }
    138 
    139     /**
    140      * 后序遍历
    141      */
    142     public void postorderPrint() {
    143         if (left != null)
    144             left.postorderPrint();
    145         if (right != null)
    146             right.postorderPrint();
    147         System.out.println(data);
    148     }
    149 
    150     public void print(int depth) {
    151         int i;
    152         // 打印缩进和当前结点中的数据
    153         for (i = 1; i <= depth; i++)
    154             System.out.println("  ");
    155         System.out.println(data);
    156         // 打印左子树
    157         if (left != null)
    158             left.print(depth + 1);
    159         else if (right != null) {
    160             for (i = 1; i <= depth + 1; i++)
    161                 System.out.println("  ");
    162             System.out.println("--");
    163         }
    164 
    165         // 打印右子树
    166         if (right != null)
    167             right.print(depth + 1);
    168         else if (left != null) {
    169             for (i = 1; i <= depth; i++)
    170                 System.out.println("  ");
    171             System.out.println("--");
    172         }
    173     }
    174 
    175     /**
    176      * 统计树共有多少个结点
    177      * 
    178      * @param root
    179      * @return 返回结点数
    180      */
    181     public static <E> int treeSize(BTNode<E> root) {
    182         if (root == null)
    183             return 0;
    184         else
    185             return 1 + treeSize(root.left) + treeSize(root.right);
    186     }
    187 
    188     /**
    189      * 二叉树的深度递归算法
    190      * 
    191      * @param root
    192      * @return 返回树的深度
    193      */
    194     public static <E> int depth(BTNode<E> root) {
    195         if (root == null)
    196             return 0;
    197         else {
    198             int m = depth(root.left);
    199             int n = depth(root.right);
    200 
    201             // 树的深度每次依靠这个三目运算符后加一来递增的
    202             return (m > n ? m : n) + 1;
    203         }
    204     }
    205 
    206 }
  • 相关阅读:
    golang版本管理工具gvm
    golang问题101
    服务器部署Jupyter Notebook
    Python 获取MySql某个表所有字段名
    Python自带HTTP文件传输服务
    log4net 配置
    GridView控件RowDataBound事件中获取列字段值的几种途径
    最简单去Button回车事件
    oracle 多条执行语句同时执行
    MERGE Into
  • 原文地址:https://www.cnblogs.com/Lowp/p/2675700.html
Copyright © 2011-2022 走看看