6-3 向二分搜索树中添加元素 6-4 改进添加操作:深入理解递归终止条件

二分搜索树添加新元素60,

60>41(根节点),所以一定要插入到41的右子树。

接着在和58比较

 

 

 

 1 public class BST<E extends Comparable<E>> {//对于二分搜索树所存储的内容支持泛型,所以在这里写一个E,此外二分搜索树不是支持所有的类型,对这个类型必须要有限制,
 2     //这个限制是这个类型必须拥有可比较性,放到代码中,就必须对E进行限制,即E extends Comparable<E>(E要满足可比较性)
 3 
 4     private class Node {  //声明节点类
 5         public E e;  //节点可以存放元素e
 6         public Node left, right;  //成员变量
 7 
 8         public Node(E e) {  //node的构造函数,用户传来一个e
 9             this.e = e;   //this.e等于用户传来的e(用户传来的参数和节点类成员变量元素均用e表示,所以节点存放元素用this.e表示)
10             left = null;
11             right = null;
12         }
13     }
14     //二分搜索树的成员变量root、size
15     private Node root;  //root:根节点
16     private int size;  //size:记录二分搜索树存储了多少元素
17 
18     public BST(){    //二分搜索树的构造函数
19         root = null;  //初始化时二分搜索树一个元素也没有存,根节点root为空
20         size = 0;
21     }
22 
23     public int size(){
24         return size;
25     }
26 
27     public boolean isEmpty(){
28         return size == 0;
29     }
30 
31     // 向二分搜索树中添加新的元素e
32     public void add(E e){
33 
34         if(root == null){
35             root = new Node(e);
36             size ++;
37         }
38         else
39             add(root, e);
40     }
41 
42     // 向以node为根的二分搜索树中插入元素e,递归算法
43     private void add(Node node, E e){
44         //-------------递归的终止条件-------------------//
45         if(e.equals(node.e))    //先检查一下要插入的元素e是否等于node的e,如果等于的话,其实就等于我们要插入的元素在二分搜索树中已经有啦。对于这种情况直接return
46             return;
47         else if(e.compareTo(node.e) < 0 && node.left == null){ //否则,如果要插入的e小于根节点node的e,且node的左子树为空,插入node的左子树
48             node.left = new Node(e);
49             size ++;
50             return;
51         }
52         else if(e.compareTo(node.e) > 0 && node.right == null){
53             node.right = new Node(e);
54             size ++;
55             return;
56         }
57         //-------------递归的终止条件----结束---------------//
58 
59         //--------------递归调用------------------//
60             //如果没有在递归的终止条件成功的return回去的话,就会根据二分搜索树固有的递归结构来看是向节点的左子树插入元素e还是向节点的右子树插入元素e
61         if(e.compareTo(node.e) < 0)//如果要插入的e小于根节点node的e
62             add(node.left, e);
63         else //e.compareTo(node.e) > 0
64             add(node.right, e);
65     }
66 }

 

对于二分搜索树的插入操作现在这么写是比较复杂的,在下一小节将改进代码,算法没有变化,但会让代码简洁很多。通过下一节,会让大家体会对于递归算法来说,一方面有不同是写法,另一方面终止条件也会有不同的考量。

 

6-4 改进添加操作:深入理解递归终止条件

 这个递归函数的终止条件非常的臃肿,因为要考虑它的左孩子是不是空、右孩子是不是为空

事实上,空本身也是一颗二叉树,如果二叉树为空的话,此时肯定要插入一个节点,

完整代码如下:

 1 public class BST<E extends Comparable<E>> {
 2 
 3     private class Node {
 4         public E e;
 5         public Node left, right;
 6 
 7         public Node(E e) {
 8             this.e = e;
 9             left = null;
10             right = null;
11         }
12     }
13 
14     private Node root;
15     private int size;
16 
17     public BST(){
18         root = null;
19         size = 0;
20     }
21 
22     public int size(){
23         return size;
24     }
25 
26     public boolean isEmpty(){
27         return size == 0;
28     }
29 
30     // 向二分搜索树中添加新的元素e
31     public void add(E e){
32         root = add(root, e);
33     }
34 
35     // 向以node为根的二分搜索树中插入元素e,递归算法
36     // 返回插入新节点后二分搜索树的根
37     private Node add(Node node, E e){
38         if(node == null){
39             size ++;
40             return new Node(e);
41         }
42         //不管是左子树插入元素还是右子树插入元素,插入完成后,都将当前node的左孩子node.left 、右孩子node.right进行重新赋值,node也会得到更新,最后return node;,返回插入新节点后二分搜索树的根
43         if(e.compareTo(node.e) < 0)
44             node.left = add(node.left, e);
45         else if(e.compareTo(node.e) > 0)
46             node.right = add(node.right, e);
47 
48         return node;
49     }
50 }

 

转载于:https://www.cnblogs.com/make-big-money/p/10331890.html

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

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

相关文章

ClassNotFoundException:是否减慢了您的JVM?

大多数Java开发人员都熟悉臭名昭著且非常常见的java.lang.ClassNotFoundException 。 虽然通常已经很好地了解了此问题的根源&#xff08;类路径中缺少类/库&#xff0c;类加载器委派问题等&#xff09;&#xff0c;但对整体JVM和性能的影响通常是未知的。 这种情况可能会对您的…

jQuery 遍历 each()方法

输出每个 li 元素的文本&#xff1a; $("button").click(function(){$("li").each(function(){alert($(this).text())});});亲自试一试 定义和用法 each() 方法规定为每个匹配元素规定运行的函数。 提示&#xff1a;返回 false 可用于及早停止循环。 语法…

java服务器端测试_java-在服务器端测试Spring Web Services端点?

我正在使用Spring WS 2.0.我已经看到了端点和测试用例以测试端点.Endpointpublic class CustomerEndpoint {ResponsePayloadpublic CustomerCountResponse getCustomerCount(RequestPayload CustomerCountRequest request) {CustomerCountResponse response new CustomerCount…

CSS样式表的规划与组织

如果你的工作过程中遇到以下问题&#xff0c;那么请你阅读此文章。 1&#xff1a;样式表文件里面的代码混乱&#xff0c;随着项目的进展&#xff0c;样式表里面的先有代码不敢做任何改变&#xff0c;因为连自己也不知道改了以后会给现有项目造成什么影响。更不敢删除。因为连自…

【链接】Linux C/C++ 学习路线-已拿腾讯、百度 offer

https://www.nowcoder.com/discuss/203082?type0&order0&pos69&page1 https://www.nowcoder.com/discuss/193598 https://www.nowcoder.com/discuss/164781 https://www.nowcoder.com/discuss/188367 https://www.nowcoder.com/discuss/188367 已经有两年C经验的话…

游戏文本本地化(一)

游戏中常见的文本本地化一般包括以下几项: 1、代码 --- 即直接写在代码中的文本 2、配置表 --- 主要由策划配置 3、UIPrefab --- 制作预设在Label上直接写入的文本 4、图片字 --- 包括 UIPrefab、UI 特效上的美术字 5、新手引导 --- 主要由配置新手引导的相关人员产生 6、错误码…

Dropwizard:轻松的RESTful JSON HTTP Web服务

寻求快速&#xff0c; 轻松地创建可用于生产环境的RESTful JSON HTTP Web服务的Java开发人员应该考虑Dropwizard框架。 Dropwizard汇集了相互补充的广受好评的库&#xff0c;因此您可以了解重要的内容&#xff1a;编写和交付工作代码。 对于那些对所用库的详细信息感兴趣的人&a…

split 将字符串分割成字符串数组

list_name list_name.split(","); split() 方法用于把一个字符串分割成字符串数组。 语法 stringObject.split(separator,howmany) 参数描述separator 必需。字符串或正则表达式&#xff0c;从该参数指定的地方分割 stringObject。howmany …

python可以自动写文章吗_让python来告诉你神奇的操作,如何实现文章自动化

三河讲python首先来告诉大家下面的Python程序实现了通过从网页抓取一篇文章&#xff0c;然后根据这篇文章来生成新的文章&#xff0c;这其中的原理就是基于概率统计的文本分析。过程大概就是网页抓取数据->统计分析->生成新文章。网页抓取数据是通过BeautifulSoup库来抓取…

badboy的录制和jmeter的使用

v Jmeter是什么 Apache Jmeter是Apache组织开发的基于Java的压力测试工具。Jmeter可以用于对服务器、网络或对象模拟巨大的负载&#xff0c;来自不同压力类别下测试它们的强度和分析整体性能。另外&#xff0c;Jmeter能够对应用程序做功能、回归测试&#xff0c;通过创建带有断…

一张图看懂offsetX, clientX, pageX, screenX的区别

1.具体含义见下图1 2.浏览器的兼任情况 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

接口一个被我忽略的地方--接口重定向技术

习惯于用IDE生成接口方法了,右键点击"Implement Interface",生成所有的接口方法声明,还带个Region多方便啊.今天看<<CLR Vir C#>>时才了解到自己是知其然不知其所有然啊. 实现接口方法很简单,新手估计也都会,但怎么理解这个过程,不见得所有人都知道 Base…

java extends throws_继承,方法签名,方法重写和throws子句

容易记住访问修饰符可以从限制更改为限制更少&#xff0c;例如从受保护到公共&#xff0c;但反之亦然throws签名可以是从父异常更改为子异常类&#xff0c;但反之亦然此代码有效public class A {protected String foo() throws Exception{return "a";}class B extend…

[BZOJ]4071: [Apio2015]巴邻旁之桥

题解: 首先 明确 如果处于同一区域时 直接统计贡献即可 不用过桥 对k分情况讨论: 当k1时 假设桥的位置是 p 那么 $$ \sum_{i1}^n |x_i-p||y_i-p| $$ 很显然当对于 所有x,y排序后的中位数是最优的选择位置 具体证明可以模拟一下 当k2时 假设桥的位置是$p_1$和$p_2$ $$ \su…

vue 学习之路 —— 图片的引入

问题记录&#xff1a;在img中动态设置了src后&#xff0c;图片路径找不到 原因&#xff1a;vue中动态生成的路径无法被url-loader解析到 解决方法&#xff1a; 1、将图片放在static文件夹&#xff0c;然后正常解析 2、将图片使用import方法引入 3、 采用背景图做法&#xff0c;…

跟踪异常–第5部分–使用Spring进行计划

看来我终于快要结束本系列有关使用Spring进行错误跟踪的博客了&#xff0c;对于那些还没有阅读该系列博客的人&#xff0c;我正在编写一个简单但几乎具有工业实力的Spring应用程序&#xff0c;扫描日志文件中的异常&#xff0c;然后生成报告。 在本系列的第一个博客中&#xff…

java.util.hashmap_java.util.HashMap中的无限循环

我在这里经常有一些Vaadin代码阻塞,我不知道问题是什么&#xff1a;Thread 7892: (state IN_JAVA)- java.util.HashMap.getEntry(java.lang.Object) bci61, line349 (Compiled frame; information may be imprecise)- java.util.HashMap.containsKey(java.lang.Object) bci2, …

APP测试理论知识点

什么是APP测试&#xff1f; App测试就是软件工程师对这类应用软件进行功能测试&#xff0c;性能测试&#xff0c;安全性测试以及兼容性测试等。 对于app测试我们一般采用的是黑盒测试方法&#xff0c;也会在必要的时候进行自动化测试以及性能测试&#xff0c;丙炔对于app还会有…

超大超长图片居中显示且放大缩小无影响

1. 超大图片居中显示 1.1 放大缩小都居中显示 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Document</title><style>body {overflow-x: hidden;}.top-banner .banner-list a {display: b…

蘋果的秘密武器

蘋果公司(Apple)在電腦操作平台之戰中負於微軟公司 (Microsoft)已經過去很多年了。如今﹐90%以上的筆記本電腦和台式電腦在使用微軟的Windows操作系統。然而近幾年來﹐蘋果公司對Windows主宰的世界發起突然襲擊﹐它的武器就是Windows版的iTunes﹐一個免費的媒體管理、儲存和播放…