二叉排序树(BinarySortTree)

相关知识:

二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。

二叉树中的左右子树不可随意交换。

根节点:一棵树最上面的节点称为根节点。

父节点、子节点:如果一个节点下面连接多个节点,那么该节点称为父节点,它下面的节点称为子 节点。

叶子节点:没有任何子节点的节点称为叶子节点。

兄弟节点:具有相同父节点的节点互称为兄弟节点

二叉排序树:

二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树,他的特点如下:

  • 若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值
  • 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值
  • 左、右子树也分别为二叉排序树

二叉排序树的结构如下图所示:

插入元素:

二叉排序树是一种动态树表。其特点是:树的结构通常不是一次生成的,首先执行查找算法,找出被插结点的父亲结点。判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。

注:新插入的结点总是叶子结点。

查找元素:

若根结点的关键字值等于查找的关键字,成功;否则,若小于根结点的关键字值,递归查左子树;若大于根结点的关键字值,递归查右子树;若子树为空,查找不成功。

使用Java语言实现排序二叉树:

  1.定义一个二叉树的封装节点类Node:

  在Node类中,定义三个属性,int类型的value表示节点的值,Node类型的left表示节点的左子树,Node类型的right表示节点的右子树,并提供构造器和set、get方法。

 1 package BST;
 2 /**
 3  * 二叉树节点类
 4  * 属性:左子树,右子树,值
 5  * 构造器,修改器和访问器
 6  * @author ASUS
 7  *
 8  */
 9 public class Node {
10     private int value; //
11     private Node left; //左子树
12     private Node right; //右子树
13     
14     //无参构造器
15     public Node(){
16         
17     }
18     
19     //有参构造器
20     public Node(Node left,Node right,int value){
21         this.left=left;
22         this.right=right;
23         this.value=value;
24     }
25     
26     //重载,一个参数构造器
27     public Node(int value) {
28         this.left=null;
29         this.right=null;
30         this.value=value;
31     }
32 
33     //访问器和修改器
34     public int getValue() {
35         return value;
36     }
37 
38     public void setValue(int value) {
39         this.value = value;
40     }
41 
42     public Node getLeft() {
43         return left;
44     }
45 
46     public void setLeft(Node left) {
47         this.left = left;
48     }
49 
50     public Node getRight() {
51         return right;
52     }
53 
54     public void setRight(Node right) {
55         this.right = right;
56     }
57     
58     
59 }

  2.定义一个排序二叉树的工具类BSTTools

  该类用于实现创建一个BST,在BST中遍历元素和在BST中删除指定元素等方法。

  实现删除BST中指定元素的方法时,需要提供两个参数。分为三种情况,一种是要删除的元素key比根节点小,一种等于根节点,一种是比根节点大。

    而当删除元素的key等于根节点时又分为三种情况:(假如删除的结点为p)

  • 要删除的p结点是叶子结点,只需要修改它的双亲结点的指针为空
  • 若p只有左子树或者只有右子树,直接让左子树/右子树代替p
  • 若p既有左子树,又有右子树 ,用p左子树中最大的那个值代替p,重接其左子树

  实现遍历时有两种方法:非递归遍历和递归遍历

    采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的)

  遍历二叉排序树时,有三种方法:

  • 先序遍历,先遍历根节点,然后遍历左子树,再遍历右子树
  • 中序遍历,先遍历左子树,然后遍历根节点,再遍历右子树(在BST中推荐使用该方法进行遍历,因为遍历结果呈现为各个节点按照从小到大依次排序)
  • 后序遍历,先遍历左子树,然后遍历右子树,再遍历根节点
  1 package BST;
  2 
  3 import java.util.Stack;
  4 
  5 public class BSTTools {
  6     private static Node root=null; //创建一个唯一的根节点
  7     
  8     /*该方法用于在BST中插入节点,参数为key
  9      * 步骤是:
 10      * 1.先定义插入节点的父节点,将root赋值给节点p
 11      * 2.节点p从根节点root开始查找,找到插入节点的相应位置
 12      * 3.在相应位置插入节点
 13      */
 14     public boolean insertNode(int key) {
 15         Node pNode=root;
 16         Node prev=null;//插入节点的父节点,设置其为null
 17         
 18         //找到插入节点的相应位置
 19         while(pNode!=null){
 20             prev=pNode;
 21             if (key<pNode.getValue()) {
 22                 pNode=pNode.getLeft();
 23             }else if (key>pNode.getValue()) {
 24                 pNode=pNode.getRight();
 25             }else{
 26                 return true;
 27             }
 28         }
 29         
 30         //将节点插入到相应的位置
 31         if (root==null) {
 32             root=new Node(key);    
 33         }else if (key>prev.getValue()) {
 34             prev.setRight(new Node(key));
 35         } else {
 36             prev.setLeft(new Node(key));
 37         }
 38         return true;
 39     }
 40     
 41     /*中序遍历排序二叉树,有两中方法,递归遍历和非递归遍历,
 42      *中序遍历对二叉树来说就是将各个节点从小到大进行排序
 43      */
 44     
 45     /*非递归中序遍历二叉树
 46      *步骤是:
 47      *1,创建一个栈,从根节点开始遍历
 48      *2,利用循环来遍历,先左子树,后根节点,再右子树
 49      */
 50     public void sort() {
 51         //new一个stack的对象用来存储节点值,stack是堆存储,特点是:先进后出(FILO),跟栈类似
 52         Stack<Node> stack=new Stack<Node>();
 53         Node node=root;
 54         //从根节点开始遍历
 55         while(node!=null||!stack.isEmpty()){
 56             //如果根节点不为null,就循环先将左子树节点不断压入堆中  
 57             while (node!=null) {
 58                  stack.push(node);
 59                  node=node.getLeft();
 60             }
 61             //stack.pop()方法表示移除并返回栈顶元素 
 62             node=stack.pop();
 63             //打印栈顶元素的值,即该节点的值
 64             System.out.println(node.getValue());
 65             //获得右子树
 66             node=node.getRight();
 67         }
 68     }
 69     
 70     /*递归中序遍历二叉树
 71      * 步骤是:
 72      * 利用递归方法来遍历,先左子树,后根节点,再右子树
 73      */
 74     public static void sort(Node node) {
 75         if (node==null) {
 76             return;
 77         } else {
 78             sort(node.getLeft());
 79             System.out.println(node.getValue());
 80             sort(node.getRight());
 81         }
 82     }
 83     
 84     //删除BST中的元素
 85     
 86     //从根节点开始查找相应的节点并删除
 87     public void delete(int key) {
 88         delete(root,key);
 89     }
 90     
 91     /*
 92      * 在BST中删除有三种情况:
 93      * 1.要删除的元素key比根节点小
 94      * 2.等于根节点
 95      * 3.比根节点大 
 96      */
 97     
 98     //从指定的节点开始查找相应的节点并删除
 99     public boolean delete(Node node,int key) {
100         if(node==null){
101             return false;
102         }else{
103             if (key==node.getValue()) {
104                 return deleteBST(node);
105             } else if (key<node.getValue()) {
106                 return delete(node.getLeft(),key);
107             } else {
108                 return delete(node.getRight(),key);
109             }
110         }
111     }
112     
113     /*
114      * 当删除的key和node.getValue相等时又分为三种情况:假如删除的结点为p
115      * 1.要删除的p结点是叶子结点,只需要修改它的双亲结点的指针为空
116      * 2.若p只有左子树或者只有右子树,直接让左子树/右子树代替p
117      * 3.若p既有左子树,又有右子树 ,用p左子树中最大的那个值代替p,重接其左子树
118      */
119     private boolean deleteBST(Node node) {
120         // TODO Auto-generated method stub
121         Node temp=null;
122         /*右子树空,只需要重接它的左子树 
123          *如果是叶子结点,在这里也把叶子结点删除了 
124          */
125         if (node.getRight()==null) {
126             temp=node;
127             node=node.getLeft();
128         //左子树空, 重接它的右子树
129         } else if (node.getLeft()==null) {
130             temp=node;
131             node=node.getRight();
132         //左右子树均不为空
133         } else {
134             temp=node;
135             Node sNode=node;
136             //转向左子树,然后向右走到“尽头”
137             sNode=sNode.getLeft();
138             while (sNode.getRight()!=null) {
139                 temp=sNode;
140                 sNode=sNode.getRight();
141             }
142             //将左子树最大的值代替被删除节点
143             node.setValue(sNode.getValue());
144             //将原来左子树最大值节点的左子树改为该节点父节点的右子树。
145             temp.setRight(sNode.getLeft());
146         }
147         return true;
148     }
149 }

  3.定义一个测试类BinarySortTree:

  该类主要用于测试BST。

 1 package BST;
 2 
 3 public class BinarySortTree {
 4     public static void main(String[] args) {
 5         BSTTools bstTools=new BSTTools();
 6         //构建的二叉树没有相同元素
 7         int[] num = {4,7,2,1,10,6,9,3,8,11,2, 0, -2}; 
 8         for (int i = 0; i < num.length; i++) {
 9             bstTools.insertNode(num[i]);
10         }
11         bstTools.sort();
12         bstTools.delete(4);
13         System.out.println("------------------");
14         bstTools.sort();
15     }
16 }

 

转载于:https://www.cnblogs.com/wangjiong/p/11165863.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fpga初始化错误_FPGA复位设计常见问题及处理方法

一开始接触到FPGA&#xff0c;肯定都知道”复位“&#xff0c;即简单又复杂。简单是因为初学时&#xff0c;只需要按照固定的套路——按键开关复位&#xff0c;见寄存器就先低电平复位一次&#xff0c;这样一般情况可以解决99%的问题&#xff0c;甚至简单的设计&#xff0c;就不…

惠普台式计算机系列,惠普发布设计笔记本、设计台式电脑等Z系列产品

惠普发布新一代惠普Z系列产品&#xff0c;包含设计笔记本、设计台式电脑、显示器和VR等产品。惠普Z系列设计笔记本HP ZBook 14u G6配有4K显示屏&#xff0c;支持100% Adobe RGB色域显示&#xff0c;拥有600尼特亮度&#xff0c;满足创意族群对色彩的精确要求。HP ZBook 15u G6图…

计算机应用需要英语水平,英语对计算机专业的重要性及如何提高英语水平

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼计算机研发人员要掌握的专业英语要求教高&#xff0c;必须掌握大量的专业术语和缩略语; 熟练掌握语法和惯用法的表达方式和功能; 能阅读英文文档和技术资料&#xff0c;阅读熟读在100词/分钟以上; 能借助字典翻译专业技术图书; 能使…

python asyncio 并发编程_asyncio并发编程

一. 事件循环1.注&#xff1a;实现搭配&#xff1a;事件循环回调(驱动生成器【协程】)epoll(IO多路复用)&#xff0c;asyncio是Python用于解决异步编程的一整套解决方案&#xff1b;基于asynico&#xff1a;tornado&#xff0c;gevent&#xff0c;twisted(Scrapy&#xff0c;dj…

ORM多表操作之多对多查询

创建多对多的关系 authormodels.ManyToManyFleld(" ")  (推荐) 书籍对象它的所有关联作者 book_obj.authors.all() 掌握&#xff1a;通过filter values(双下划线)进行多对多的关联查询&#xff08;形式一对多&#xff09; django是将python语句翻译成sql语句执行 聚…

计算机的iscsi配置,我们将了解如何设置自己的支持iscsi配置的存储节点

iSCSI代表Internet小型计算机系统接口。它用于使用块级数据传输通过TCP / IP访问网络上的存储。NFS与iSCSI之间通常存在比较。关键区别在于NFS是文件级实现&#xff0c;而iSCSI是块级实现。这适用于TCP / IP层&#xff0c;并允许通过局域网(LAN)发送SCSI命令。在诸如iSCSI和光纤…

介词for和with 和of的用法_英语中的for,to,at,of,in,on,with的用法

英语中的for,to,at,of,in,on,with的用法英语中的for,to,at,of,in,on,with的用法人气&#xff1a;594 ℃时间&#xff1a;2019-11-07 00:56:02优质解答一、介词按其构成可分为&#xff1a;1.简单介词 at,in,on,to,since,until 等.如&#xff1a;Hes worked there since 1998.2.复…

转帖:解决System.Data.OracleClient requires Oracle client software version 8.1.7 or greater

原帖&#xff1a;http://blog.csdn.net/killer000777/archive/2008/12/03/3438519.aspx 原来当Oracle 9.2运行在NTFS的分区上时&#xff0c;对于某些非administrator组的用户&#xff0c;ORACLE_HOME 目录是不可见的&#xff0c;而在windows server 2003下Asp.net应用使用的帐户…

超级计算机发展及现状论文,浅谈超级计算机发展的过程及研究现状

摘要&#xff1a;当前,多核技术的不断发展和日渐成熟,使得处理器的性能得到巨大提升.但是对于存储设备来说,无论是速度还是容量都无法跟上这种步伐.随着处理器和其它子系统发展差距的日益加大,超级计算机的效率问题逐渐成为人们讨论和研究的热点,大部分的实际应用在超级计算机上…

P1047 校门外的树 Noip2005普及组第二题

洛谷红题&#xff08;咳咳&#xff09;>>>>点击跳转 题目描述 某校大门外长度为L的马路上有一排树&#xff0c;每两棵相邻的树之间的间隔都是11米。我们可以把马路看成一个数轴&#xff0c;马路的一端在数轴00的位置&#xff0c;另一端在LL的位置&#xff1b;数轴上…

裂变红包码的制作_红包墙裂变源码活码玩法 实现多次裂变传播

这是一个移动互联网迅速发展的时代&#xff0c;每个人都是一个自媒体&#xff0c;都有自己的朋友圈和社群。门店除了依靠自己雄厚的实力外&#xff0c;还应该充分用好每个店员的资源&#xff0c;让每个店员这个自媒体为门店所用&#xff0c;将能力发挥到极致。红包推出的超级红…

计算机基础知识复习资料,计算机基础知识复习资料

.Word 资料Ch1 计算机基础知识1.1 现代信息技术1.1.1、特征&#xff1a;●以数字技术和电子技术为基础&#xff1b;●以计算机及其软件为核心&#xff1b;●采用电子技术(包括激光技术)进行信息的收集、传递、加工、存储、显示与控制。1.1.2、数字技术一、二进位数字——比特(b…

linux上安装Docker

Docker的三大核心概念&#xff1a;镜像、容器、仓库 镜像&#xff1a;类似虚拟机的镜像、用俗话说就是安装文件 容器&#xff1a;类似一个轻量级的沙箱&#xff0c;容器是从镜像创建应用运行实例&#xff0c;可以将其启动、开始、停止、删除、而这些容器都是相互隔离、互不可见…

python节日贺卡图片_节日贺卡图片制作手工

手工贺卡&#xff0c;相信你也对贺卡感到很大的兴趣的吧&#xff0c;手工贺卡。手工贺卡范文&#xff0c;欢迎阅读。所需材料&#xff1a;黑纸胶水压钱粉红色的纸具体步骤&#xff1a;1黑色和红色纸剪成宽度为5mm的长条的,画出你喜欢的花树轮廓&#xff0c;使用笔温柔的拉伸黑色…

幼儿园计算机教师论文,幼儿园中班教师论文

幼儿园中班教师论文导语&#xff1a;幼儿教育是什么&#xff1f;幼儿应如何正确接受教育&#xff1f;幼儿接受与不接受教育区别又如 何&#xff1f;这些看似简单的问题&#xff0c;其实不然。在当今科技发达的今天&#xff0c;幼儿的教育起着承前启后的重要阶段&#xff0c;不仅…

ASP.NET 5 入门 (2) – 自定义配置

原文:ASP.NET 5 入门 (2) – 自定义配置ASP.NET 5 入门 (2) – 自定义配置 ASP.NET 5 理解和入门 建立和开发ASP.NET 5 项目 初步理解ASP.NET5的配置 正如我的第一篇文章ASP.NET 5 (vNext) 理解和概述 所说,ASP.NET 5的具有全新的配置机制,我们可以通过以下几点来进行理解: 支持…

中有冒号 文件路径_用Matlab脚本文件实现Excel文件的合并

日常吐槽前段时间跟同事聊天&#xff0c;同事洗脑了一个新的&#xff08;扎心的&#xff09;世界观&#xff0c;“人生分三个阶段&#xff0c;20岁时承认父母很平庸&#xff0c;30岁时承认自己很平庸&#xff0c;40岁时承认孩子很平庸”。这是这位同事在孩子学而思考试后的心得…

2019计算机国二操作题,2019年3月计算机二级C++操作练习题及答案(十二)

一、程序改错题使用VC6.0打开考生文件夹下的源程序文件1.cpp&#xff0c;该程序运行时有错&#xff0c;请改正其中的错误&#xff0c;使程序正常运行&#xff0c;输出的结果为Constructor&#xff0c;i0&#xff0c;Destructor注意&#xff1a;错误的语句在//******error******…

最简单的一个 STL格式的网格文件

简介 最简单格式的一个STL格式的文件 文件内容 solid filenamestlfacet normal 1 1 1outer loopvertex 0 0 1vertex 0 1 0vertex 1 0 0endloopendfacet endsolid filenamestl 简单描述 solid filenamestlfacet normal 1 1 1//面的法向量outer loopvertex 0 0 1 // 顶点1vertex …

ntrip获取源列表_Ntrip协议简介(转)

1 什么是Ntrip&#xff1f;CORS(Continuously Operating Reference Stations)就是网络基准站&#xff0c;通过网络收发GPS差分数据。用户访问CORS后&#xff0c;不用单独架设GPS基准站&#xff0c;即可实现GPS流动站的差分定位。访问CORS系统&#xff0c;就需要网络通讯协议。N…