在计算机科学中,树是非常重要的数据结构二叉排序树是树的一种特殊情况二叉排序树是,它的每个节点只能有两个子节点,左子树的节点小于其父节点,右子树中的节点大于其父节点. 父节点二进制排序树在搜索中使用非常广泛,并且二进制排序树的一种变体(红色和黑色树)是Java中TreeMap和TreeSet的实现基础. 以下是二进制排序树的定义. 使用了两个类. 一个是Node类,它表示树中的节点,另一个是Name类,它表示节点的数据. Name类实现Comparable接口,以便可以比较节点. 大小.

public class BinarySearchTree{

private Node root;

private int size;

public BinarySearchTree(Node root){

this.root=root;

size++;

}

public int getSize(){

return this.size;

}

public boolean contains(Name name){

return contains(name,this.root);

//return false;

}

private boolean contains(Name n,Node root){

if(root==null){

return false;

}

int compare=n.compareTo(root.element);

if(compare>0){

if(root.right!=null){

return contains(n,root.right);

}else{

return false;

}

}else if(compare<0){

if(root.left!=null){

return contains(n,root.left);

}else{

return false;

}

}else{

return true;

}

}

public boolean insert(Name n){

boolean flag = insert(n,this.root);

if(flag) size++;

return flag;

}

private boolean insert(Name n,Node root){

if(root==null){

this.root=new Node(n);

return true;

}else if(root.element.compareTo(n)>0){

if(root.left!=null){

return insert(n,root.left);

}else{

root.left=new Node(n);

return true;

}

}else if(root.element.compareTo(n)<0){

if(root.right!=null){

return insert(n,root.right);

}else{

root.right=new Node(n);

return true;

}

}else{

root.frequency++;

return true;

}

}

public boolean remove(Name name){

root = remove(name,this.root);

if(root != null){

size--;

return true;

}

return false;

}

private Node remove(Name name,Node root){

int compare = root.element.compareTo(name);

if(compare == 0){

if(root.frequency>1){

root.frequency--;

}else{

/**根据删除节点的类型,分成以下几种情况

**①如果被删除的节点是叶子节点,直接删除

**②如果被删除的节点含有一个子节点,让指向该节点的指针指向他的儿子节点

**③如果被删除的节点含有两个子节点,找到左字数的最大节点,并替换该节点

**/

if(root.left == null && root.right == null){

root = null;

}else if(root.left !=null && root.right == null){

root = root.left;

}else if(root.left == null && root.right != null){

root = root.right;

}else{

//被删除的节点含有两个子节点

Node newRoot = root.left;

while (newRoot.left != null){

newRoot = newRoot.left;//找到左子树的最大节点

}

root.element = newRoot.element;

root.left = remove(root.element,root.left);

}

}

}else if(compare > 0){

if(root.left != null){

root.left = remove(name,root.left);

}else{

return null;

}

}else{

if(root.right != null){

root.right = remove(name,root.right);

}else{

return null;

}

}

return root;

}

public String toString(){

//中序遍历就可以输出树中节点的顺序

return toString(root);

}

private String toString(Node n){

String result = "";

if(n != null){

if(n.left != null){

result += toString(n.left);

}

result += n.element + " ";

if(n.right != null){

result += toString(n.right);

}

}

return result;

}

}

在二进制排序树的操作中,删除节点最难处理,因此必须将其分为许多情况分别处理. 下面是Node类和Name类的定义:

class Node{

public Name element;

public Node left;

public Node right;

public int frequency = 1;

public Node(Name n){

this.element=n;

}

}

class Name implements Comparable{

private String firstName;

private String lastName;

public Name(String firstName,String lastName){

this.firstName=firstName;

this.lastName=lastName;

}

public int compareTo(Name n) {

int result = this.firstName.compareTo(n.firstName);

return result==0?this.lastName.compareTo(n.lastName):result;

}

public String toString(){

return firstName + "-" +lastName;

}

}

最后,对二进制排序树进行测试:

public static void main(String[] args){

//System.out.println("sunzhenxing");

Node root = new Node(new Name("sun","zhenxing5"));

BinarySearchTree bst =new BinarySearchTree(root);

bst.insert(new Name("sun","zhenxing3"));

bst.insert(new Name("sun","zhenxing7"));

bst.insert(new Name("sun","zhenxing2"));

bst.insert(new Name("sun","zhenxing4"));

bst.insert(new Name("sun","zhenxing6"));

bst.insert(new Name("sun","zhenxing8"));

System.out.println(bst);

bst.remove(new Name("sun","zhenxing2"));

System.out.println(bst);

bst.remove(new Name("sun","zhenxing7"));

System.out.println(bst);

}

测试输出为:

sun-zhenxing2 sun-zhenxing3 sun-zhenxing4 sun-zhenxing5 sun-zhenxing6 sun-zhenxing7 sun-zhenxing8

sun-zhenxing3 sun-zhenxing4 sun-zhenxing5 sun-zhenxing6 sun-zhenxing7 sun-zhenxing8

sun-zhenxing3 sun-zhenxing4 sun-zhenxing5 sun-zhenxing6 sun-zhenxing8

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-208174-1.html

java系统排序_Java实现二进制排序树相关推荐

  1. java 文件遍历排序_Java的二叉树排序以及遍历文件展示文本格式的文件树

    Java二叉树排序算法排序二叉树的描述也是一个递归的描述, 所以排序二叉树的构造自然也用递归的: 排序二叉树的3个特征: 1:当前node的所有左孩子的值都小于当前node的值: 2:当前node的所 ...

  2. java中集合的排序_Java中集合排序的两种方法

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...

  3. java 字段排序_Java多字段排序之冒泡

    场景: 奥运会时期,每场赛事后,对国家的金.银.铜牌进行排序,排序规则如下: 先以金牌排序,金牌数越多,排得越前,如果金牌数相同,则比银牌数,如果银牌数一样多,则比铜牌数,如果铜牌数还一样多,则按国家 ...

  4. java 系统 类_Java常用实体类--System类

    字符串.日期.数字是Java程序中最常使用的数据对象,对这些数据的创建.修改.格式化和转换等操作融入在Java程序的每个角落,必须熟练掌握.本节将通过实例演示以下常用实体类Java系统级类:系统类Sy ...

  5. java collections.sort 忽略大小写排序_Java Spring Mongo排序忽略大小写问题

    我正在使用Spring-Data-mongodb对MongoDB执行各种请求. 尝试执行分页&时用忽略的情况排序我得到一个例外, 这是我的代码: Sort.Order order = new ...

  6. java怎么给list集合排序_java list集合排序按某一属性排序操作

    我就废话不多说了,大家还是直接看代码吧~ public List sortList(List list){ Collections.sort(list, new Comparator(){ @Over ...

  7. 选择排序java从小到大代码_java中选择排序与归并排序的内容,详细解析

    上次我们已经为大家介绍过java中插入.分治和快速排序的内容,今天再来为大家介绍一下java中选择排序与归并排序的具体内容,并且通过实际的代码为大家解析. 首先我们需要了解的是,选择排序也是一种简单直 ...

  8. java bitmap 排序_Java实现2-BitMap排序

    2-BitMap算法是BitMap算法的一种扩展,核心是:每个数分配2个bit,00表示不存在,01表示出现一次,10表示出现2次,11表示多次或无意义. 一个int类型,占4个字节,在2-BitMa ...

  9. arraylist java 排序_java的arraylist排序示例(arraylist用法)

    写了一个java数组排序示例,这里分享给大家共同学习 package com.yonyou.test; import java.util.ArrayList; import java.util.Col ...

最新文章

  1. 一个封装的使用Apache HttpClient进行Http请求(GET、POST、PUT等)的类。
  2. 几个常用有力的特征的分析LBP、HOG、FAST、SIFT/SURF、MSER、BRISK
  3. 杂项:E-Learning
  4. 基于随机梯度下降法的手写数字识别、epoch是什么、python实现
  5. 总结之《征服C指针》
  6. 我逛了下 JDK 一条街,发现了不少好东西!
  7. 携程ELK日志分析平台深耕之路
  8. Hbase笔记:批量导入
  9. (转)EPWING格式的日语词典
  10. 游戏平台系统源码开源有多重要
  11. mvn命令启动Spring boot项目
  12. ma系列之-17-磁盘和文件系统1
  13. 商城类小程序的主要功能有哪些?
  14. 因果分析.科学实验评估
  15. 北京矿大机电信息学院计算机专业,2018年中国矿业大学(北京)机电与信息工程学院免试攻读研究生初步名单公示...
  16. 计算机网络1-6章考研题
  17. 软考是什么考试?软件水平考试介绍
  18. matlab复数曲线拟合,lsqcurvefit拟合结果为复数
  19. android 6.0 SystemUI源码分析(1)-SystemUI介绍
  20. Microsoft Office for Mac最新版本安装教程,亲测可用

热门文章

  1. 因贡献Linux社区被Linus关注,受公司10万期权奖励!酷派重回大众视野...
  2. 不要再问我“Java GC垃圾回收机制”了
  3. Logback 配置文件这么写,日志 TPS 提高 10 倍
  4. 不可错过的CMS学习笔记
  5. 自考学士学位计算机题库,2020自考本科学位英语试题(附答案)
  6. mysql命令行语句_MySql命令行命令和SQL语句
  7. linux内核网络初始化,Linux内核--网络栈实现分析
  8. pytorch 扩展张量
  9. 动态卷积超进化!通道融合替换注意力,减少75%参数量且性能显著提升 | ICLR 2021
  10. OpenCV Windows Pack but it has no binaries compatible with your configuratio