zoukankan      html  css  js  c++  java
  • 二叉树——Java实现

      1 package struct;
      2  
      3 interface Tree{
      4     //插入元素
      5     void insert(int value);
      6     //中序遍历
      7     void inOrder();
      8     //先序遍历
      9     void perOrder();
     10     //后序遍历
     11     void postOrder();
     12     //层序遍历
     13     //void levelOrder();
     14     //求最小值
     15     int getMinValue();
     16     //求最小值
     17     int getMaxValue();
     18     //指定元素删除
     19     boolean delete(int value);
     20     //求元素个数
     21     int length();
     22     //求树的高度
     23     int height();
     24 }
     25  
     26 //工厂类
     27 class Factory1{
     28     //构造函数
     29     private Factory1(){}
     30     public static Tree getTreeInstance(){
     31         return new BinaryTreeImpl();
     32     }
     33 }
     34  
     35 class BinaryTreeImpl implements Tree{
     36     //根节点
     37     private Node root;
     38     private int size;
     39     class Node{
     40         //定义左子树
     41         private Node leftChild;
     42         //定义右子树
     43         private Node rightChild;
     44         private int data;
     45         //以下为构造方法
     46         public Node(int data){
     47             this.data = data;
     48         }
     49         public Node(Node leftChild, Node rightChild, int data) {
     50             super();
     51             this.leftChild = leftChild;
     52             this.rightChild = rightChild;
     53             this.data = data;
     54         }
     55     }
     56     
     57     //插入元素
     58     public void insert(int data) {
     59         Node node = new Node(data);
     60         //空树
     61         if(root == null){
     62             root = node;
     63             root.leftChild = null;
     64             root.rightChild = null;
     65             size++;
     66         }else{
     67             //非空树
     68             Node current = root;
     69             Node parent = null;
     70             while(true){
     71                 if(data < current.data){
     72                     parent = current;
     73                     current = parent.leftChild;
     74                     //当前元素小于根节点,当前节点为空
     75                     if(current == null){
     76                         parent.leftChild = node;
     77                         size++;
     78                         break;
     79                     }
     80                 }else if(data > current.data){
     81                     parent = current;
     82                     current = parent.rightChild;
     83                     //当前元素大于根节点,且当前节点为空,否则继续循环使当前的current为根节点
     84                     if(current == null){
     85                         parent.rightChild = node;
     86                         size++;
     87                         break;
     88                     }
     89                 }else{
     90                     System.out.println("have same data in the binary tree;");
     91                 }
     92             }//end of  while
     93         }
     94     }
     95     //中序遍历
     96     public void inOrder() {
     97         System.out.println("中序遍历:");
     98         inOrder1(root);
     99         System.out.println();
    100     }
    101     //中序遍历递归函数
    102     private void inOrder1(Node node){
    103         if( node == null){
    104             return;
    105         }
    106         inOrder1(node.leftChild);
    107         display(node);
    108         inOrder1(node.rightChild);
    109     }
    110     
    111     //打印函数
    112     private void display(Node node){
    113         System.out.print(node.data+" ");
    114     }
    115     
    116     //前序遍历
    117     public void perOrder() {
    118         System.out.println("前序遍历:");
    119         perOrder1(root);
    120         System.out.println();
    121     }
    122     //前序遍历递归函数
    123     private void perOrder1(Node node){
    124         if(node == null){
    125             return;
    126         }
    127         display(node);
    128         perOrder1(node.leftChild);
    129         perOrder1(node.rightChild);
    130     }
    131     
    132     //后序遍历
    133     public void postOrder() {
    134         System.out.println("后序遍历:");
    135         postOrder1(root);
    136         System.out.println();
    137     }
    138     //后续遍历递归函数
    139     private void postOrder1(Node node){
    140         if(node == null){
    141             return;
    142         }
    143         postOrder1(node.leftChild);
    144         postOrder1(node.rightChild);
    145         display(node);
    146     }
    147     //层序遍历
    148     /*
    149     public void levelOrder() {
    150     }
    151     */
    152     //求取树中元素最小值
    153     public int getMinValue() {
    154         Node node = root;
    155         //空树无最小元素
    156         if(root == null){
    157             return -1;
    158         }
    159         Node current = node.leftChild;
    160         while(true){
    161             if(current.leftChild == null){
    162                 return current.data;
    163             }
    164             current = current.leftChild;
    165         }
    166     }
    167     //求树中最大元素
    168     public int getMaxValue(){
    169         Node node = root;
    170         if(node == null){
    171             return -1;
    172         }
    173         Node current = node.rightChild;
    174         while(true){
    175             if(current.rightChild == null){
    176                 return current.data;
    177             }
    178             current = current.rightChild;
    179         }
    180     }
    181     //删除树中元素
    182     public boolean delete(int value) {
    183         return false;
    184     }
    185     //求树中元素个数
    186     public int length(){
    187         return size;
    188     }
    189     //求树的高度
    190     public int height(){
    191         if(root == null){
    192             return 0;
    193         }
    194         return height1(root);
    195     }
    196     private int height1(Node node) {
    197         if(node!=null){
    198             int lheight = height1(node.leftChild);
    199             int rheight = height1(node.rightChild);    
    200             return lheight > rheight ? lheight+1:rheight+1;
    201         }
    202         return 0;
    203     }
    204 }
    205 public class BinaryTree {
    206     public static void main(String[] args) {
    207         Tree tree = Factory1.getTreeInstance();
    208         System.out.println("===============测试insert函数=====================");
    209         tree.insert(2);
    210         tree.insert(1);
    211         tree.insert(5);
    212         tree.insert(20);
    213         tree.insert(3);
    214         tree.insert(7);
    215         tree.insert(0);
    216         tree.insert(10);
    217         System.out.println("\n"+"===============测试length函数====================="+"\n");
    218         System.out.println(tree.length());
    219         System.out.println("\n"+"===============测试inOrder函数====================="+"\n");
    220         tree.inOrder();
    221         System.out.println("\n"+"===============测试perOrder函数====================="+"\n");
    222         tree.perOrder();
    223         System.out.println("\n"+"===============测试postOrder函数====================="+"\n");
    224         tree.postOrder();
    225         System.out.println("\n"+"===============测试getMinValue函数====================="+"\n");
    226         System.out.println(tree.getMinValue());
    227         System.out.println("\n"+"===============测试getMaxValue函数====================="+"\n");
    228         System.out.println(tree.getMaxValue());
    229         System.out.println("\n"+"===============测试height函数====================="+"\n");
    230         System.out.println(tree.height());
    231         }
    232 }
    View Code

     

  • 相关阅读:
    .netcore3.1——应用文档组件Swagger
    .netcore3.1——应用验证组件FluentValidation
    闲聊项目心得
    微软官方的.net系列文档
    一分钟了解Allegro导入DXF文件
    Altium Designer快速调整丝印
    Android探究之View的绘制流程
    项目管理探究之挣值管理常见计算
    Android探究之ANR
    基于深度学习时间序列预测系统项目需求分析心得
  • 原文地址:https://www.cnblogs.com/edda/p/12595073.html
Copyright © 2011-2022 走看看