• 学习记录11 --- 数据结构之二叉排序树的java实现


    通过java实现前,先搞懂二叉排序树的定义,其实定义很简单,要么是空树,要么就拥有以下特性:

    (1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    (2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    (3) 任意节点的左、右子树也分别为二叉查找树;
    (4) 没有键值相等的节点。

    以及关于二叉树的遍历,有三种,分别为先序、中序和后序

    先序遍历:从根节点开始,先遍历左孩子并输出,当左孩子为空遍历右孩子并输出

    比如图a先序遍历就是:10  6  8  15  13  11  14  17

    中序遍历:往左孩子开始遍历,直到一个节点没有左孩子,开始原路返回并输出,知道碰到有右孩子的节点,开始遍历右孩子,如果该右孩子没有左孩子,则直接输出,否则从头开始

    比如图a中序遍历就是:6  8  10  11  13  14  15  17

    后序遍历:从左边的最末层往上遍历,先是遍历左孩子并输入,然后遍历右孩子并输出,根节点最后输出

    比如图a后序遍历就是:8  6  11  14  13  17  15  10

    那么弄清楚后,我们就来通过java实现,就特别简单了

      1 package org.lanqiao;
      2 
      3 import java.util.ArrayList;
      4 import java.util.List;
      5 
      6 public class BinaryTree {
      7 
      8     //二叉树的实体类
      9     public static class Tree {
     10         public Tree lChild;  //左孩子
     11         public Tree rChild;  //右孩子
     12         public int data;    //数据域
     13 
     14         public Tree(Tree lChild, Tree rChild, int data) {
     15             this.lChild = lChild;
     16             this.rChild = rChild;
     17             this.data = data;
     18         }
     19 
     20         public Tree(int data) {
     21             this.data = data;
     22             this.lChild = null;
     23             this.rChild = null;
     24         }
     25     }
     26 
     27     //存放二叉树存放
     28     static List<Tree> datas;
     29     //根节点
     30     static Tree root =null;
     31     //当前节点
     32     static Tree atNode =null;
     33 
     34     public static void main(String[] args) {
     35         //创建一个数组存放值
     36         int[] items = {8,2,3,5,1,6,11,12,8,4};
     37         //创建二叉树
     38         createBinaryTree(items);
     39         System.out.print("先序遍历:");
     40         preorder(root);
     41         System.out.print("
    中序遍历:");
     42         inorder(root);
     43         System.out.print("
    后序遍历:");
     44         postorder(root);
     45     }
     46 
     47     //创建二叉树
     48     public static void createBinaryTree(int[] items) {
     49         //创建集合
     50         datas = new ArrayList<Tree>();
     51         //遍历数组将值加入数据域
     52         for(int i:items) {
     53             datas.add(new Tree(i));
     54         }
     55         //第一个节点为根节点
     56         root = datas.get(0);
     57         int size = items.length;
     58         //开始关联左右孩子
     59         for(int i=1;i<size;i++) {
     60             //把根节点给当前节点
     61             atNode = root;
     62             //一直循环把节点插入为止
     63             while(true) {
     64                 //判断待插入节点是否比当前节点小
     65                 if(datas.get(i).data<atNode.data) {//当比当前节点小
     66                     //判断当前节点的左孩子是否为空
     67                     if(atNode.lChild!=null) {
     68                         //把当前节点的左孩子给当前节点,并结束本次循环
     69                         atNode = atNode.lChild;
     70                         continue;
     71                     }else{
     72                         //将节点插入,并结束整个循环
     73                         atNode.lChild = datas.get(i);
     74                         break;
     75                     }
     76                 }else if(datas.get(i).data>atNode.data){//比当前节点大
     77                     //判断当前节点的右孩子是否为空
     78                     if(atNode.rChild!=null) {
     79                         //把当前节点的右孩子给当前节点,并结束本次循环
     80                         atNode = atNode.rChild;
     81                         continue;
     82                     }else {
     83                         //将节点插入,并结束整个循环
     84                         atNode.rChild = datas.get(i);
     85                         break;
     86                     }
     87                 }else if(datas.get(i).data==atNode.data){
     88                     //剩下的一种情况就是相等,二叉树不允许有相等的,所以删除相等的
     89                     datas.remove(i);
     90                     //删完后要对size进行减1,不然会越界
     91                     size--;
     92                 }
     93             }
     94         }
     95 
     96     }
     97 
     98     //先序遍历
     99     public static void preorder(Tree node) {
    100         if(node!=null) {
    101             System.out.print(node.data+"	");
    102             preorder(node.lChild);
    103             preorder(node.rChild);
    104         }
    105     }
    106 
    107     //中序遍历
    108     public static void inorder(Tree node) {
    109         if(node!=null) {
    110             inorder(node.lChild);
    111             System.out.print(node.data+"	");
    112             inorder(node.rChild);
    113         }
    114     }
    115 
    116     //后序遍历
    117     public static void postorder(Tree node) {
    118         if(node!=null) {
    119             postorder(node.lChild);
    120             postorder(node.rChild);
    121             System.out.print(node.data+"	");
    122         }
    123     }
    124 }
  • 相关阅读:
    箭头函数和普通函数的区别是什么?
    前端如何优化网站性能?
    instanceof原理
    call、apply区别
    函数的节流和防抖
    关于this的指向性问题
    undefined 和null的区别?
    浅谈堆和栈的理解?
    关于vue中watch和computed
    简单说一下什么是回流和重绘
  • 原文地址:https://www.cnblogs.com/huajidafahao/p/11296629.html
Copyright © 2020-2023  润新知