xdocument查找节点值_二叉查找树(java)

一棵二叉查找树(BST)是一颗二叉树,其中每个节点都含有一个Comparable的键且每个节点的键(以及相关的值)都大于其左子树中的任意节点的键而小于右子树的任意结点的键。

数据表示

和链表一样,我们嵌套定义了一个私有类来表示二叉查找树上的一个节点。每个节点都含有一个键、一个值、一条左链接、一条右链接和一个节点计数器

查找节点

思路:

A、如果二叉查找树为空,查找失败(search miss),返回null;

B、如果根节点的键等于要查找的键,返回根节点的值(search hit)。

C、否则,继续在相应的子树中查找。如果要查找的键小于根节点的键,在左子树中查找;如果要查找的键大于根节点的键,在右子树中查找。

D、重复ABC步骤,直至search miss或者search hit。

插入节点

思路:

A、如果二叉查找树是空的,生成一个新节点,并返回该节点,相当于插入新节点后的二叉树根节点。

B、如果根节点键和要插入的键相等,更新根节点的值。

C、如果要插入的键小于根节点的键,在左子树插入,并将根节点的左链接指向插入后的左子树。

D、如果要插入的键小于根节点的键,在右子树插入,并将根节点的右链接指向插入后的右子树。

E、更新根节点的size,并返回根节点,作为插入新节点后的二叉树根节点。

F、重复ABCD,直至插入或者更新成功。

删除节点

删除节点是二叉搜索树中,最复杂的一种操作,但是也不是特别难,我们分类讨论:

  1. 要删除节点有零个孩子,即叶子节点
6ed2a76595a61bf58a5aad38a8a602a4.png

如图所示,只需要将parent.left设置为null,然后Java垃圾自动回收机制会自动删除current节点。

2.要删除节点有一个孩子

b2801d67a3f0f7d3bbd59c182c74ff3c.png

如图所示,只需要将parent.left设置为curren.right即可。

15ced33c437ade984d8bed61d593661c.gif

3.要删除节点有两个孩子

4d068eb836eafec4875af413aaca38ba.png

这种情况比较复杂,首先我们引入后继节点的概念,如果将一棵二叉树按照中序周游的方式输出,则任一节点的下一个节点就是该节点的后继节点。例如:上图中24的后继节点为26,64的后继节点为70.找到后继节点以后,问题就变得简单了,因为但删除节点有右子树,所以它的后继节点就是右子树中的最小节点。

分为两种情况:

  • 后继节点为待删除节点的右子,只需要将curren用successor替换即可,注意处理好current.left和successor.right.

注意:这种情况下,successor一定没有左孩子,一但它有左孩子,哪它必然不是current的后继节点。

eb7428569bbc414da15d8afc174b1adf.png
24078471ffdee418a4279330cb3f8ac2.gif
  • 后继节点为待删除结点的右孩子的左子树,这种情况稍微复杂点,请看动态图片演示。
1a3a967fc7f934c764803893b493d952.png
abaee58950ed825cdd98d200215a6a7a.gif

删除节点分4步

(1)将只想即将被删除的的节点链接保存为t

(2)将x指向它的后继节点min(t.right)

(3)将x的右链接指向deleteMin(x.right)

(4)将x的左链接设为t.left

实现

package find;public class BST, Value> {    private Node root;    public Value get(Key key) {        return get(root, key);    }    //插入操作    public void put(Key key, Value val) {        root = put(root, key, val);    }    //查询    private Value get(Node x, Key key) {        if (x == null) {            return null;        }        int cmp = key.compareTo(x.key);        if (cmp < 0) {            return get(x.left, key);        } else if (cmp > 0) {            return get(x.right, key);        } else {            return x.val;        }    }    private Node put(Node x, Key key, Value val) {        if (x == null) {            return new Node(key, val, 1);        }        int cmp = key.compareTo(x.key);        if (cmp < 0) {            x.left = put(x.left, key, val);        } else if (cmp > 0) {            x.right = put(x.right, key, val);        } else {            x.val = val;        }        x.N = size(x.left) + size(x.right) + 1;        return x;    }    public int size() {        return size(root);    }    private int size(Node x) {        if (x == null) {            return 0;        } else {            return x.N;        }    }    public Key min() {        return min(root).key;    }    private Node min(Node x) {        if (x.left == null) {            return x;        }        return min(x.left);    }    public Key floor(Key key) {        Node x = floor(root, key);        if (x == null) {            return null;        }        return x.key;    }    private Node floor(Node x, Key key) {        if (x == null) return null;        int cmp = key.compareTo(x.key);        if (cmp == 0) {            return x;        } else if (cmp < 0) {            return floor(x.left, key);        }        Node t = floor(x.right, key);        if (t != null) {            return t;        } else {            return x;        }    }    public void deleteMin() {        root = deleteMin(root);    }    private Node deleteMin(Node x) {        if (x == null) {            return x.right;        }        x.left = deleteMin(x.left);        x.N = size(x.left) + size(x.right) + 1;        return x;    }    public void delete(Key key) {        root = delete(root, key);    }    private Node delete(Node x, Key key) {        if (x == null) {            return null;        }        int cmp = key.compareTo(key);        if (cmp < 0) {            x.left = delete(x.left, key);        } else if (cmp > 0) {            x.right = delete(x.right, key);        } else {            if (x.right == null) {                return x.left;            } else if (x.left == null) {                return x.right;            }            Node t = x;            x = min(t.right);            x.right = deleteMin(t.right);            x.left = t.left;        }        x.N = size(x.left) + size(x.right) + 1;        return x;    }    private class Node {        private Key key;        private Value val;        private Node left, right;        private int N;        public Node(Key key, Value val, int N) {            this.key = key;            this.val = val;            this.N = N;        }    }}

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

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

相关文章

三角形 画_CAD入门基础第3节:直角三角形的圆及如何修剪

这个软件&#xff0c;仔细想想&#xff0c;无非就两个命令&#xff0c;一是直线命令&#xff0c;二&#xff0c;就是圆。直线&#xff0c;无非也就是两种&#xff0c;一&#xff0c;是水平直线和垂直于水平直线的竖线&#xff0c;二&#xff0c;就是各种斜线。第一种直线&#…

windows 10下搭建pyspark与遇到的一些问题的解决方法

目录windows 10 下 搭建 pyspark所需要的工具过程与步骤windows 10 下 搭建 pyspark 所需要的工具 Java JDK 1.8.0 spark-2.2.0-bin-hadoop2.7 hadoop-2.7.3 winutils.exe 还需要有python环境&#xff0c;我用的是Anaconda 3&#xff08;默认你已经装好此环境&#xff09;。…

Linux VNC server 安装配置

1.安装vnc server[rootpxe ~]# yum install tigervnc-server -y2.设置 vnc server 开机启动[rootpxe ~]# chkconfig vncserver on3.修改vncserver 配置文件[rootpxe ~]# vi /etc/sysconfig/vncservers在配置文件后添加以下内容VNCSERVERS"2:root"VNCSERVERARGS[2]&qu…

为什么用python写爬虫_python-做爬虫,如何避免牢狱之灾

随着数据资源的爆炸式增长&#xff0c;网络爬虫的应用场景和商业模式变得更加广泛和多样&#xff0c;网络爬虫技术为数据收集者提供了极大的便利&#xff0c;也给专业网络爬虫公司带来巨大的收益。但是与之相伴的是许多人好奇的一件事——爬虫是否违法&#xff1f; 关于这个问题…

栈(顺序存储)C++模板实现

#include <iostream> using namespace std;template <typename T> class stack{private:int top; //栈顶指针int maxLen; //栈最大长度T *data; //用数组来创建栈public:stack(int top_ -1 , int maxLen_ 10):top(top_),maxLen(maxLen_){data new T[maxLen]; …

第5章 Python 数字图像处理(DIP) - 图像复原与重建1 - 高斯噪声

本章主要讲图像复原与重建&#xff0c;首先是了解一下各种噪声的特点与模型&#xff0c;还有形成的方法。一些重点的噪声&#xff0c;如高斯噪声&#xff0c;均匀噪声&#xff0c;伽马噪声&#xff0c;指数噪声&#xff0c;还有椒盐噪声等。 本章主要的噪声研究方法主要是加性噪…

doubango简介

1、doubango官网&#xff1a;http://www.doubango.org/ doubango常用项目国内镜像&#xff08;放在淘宝的svn服务器&#xff09;&#xff0c;目前有4个项目&#xff1a;doubango, idoubs, imsdroid, telepresence。项目的svn地址如下格式http://code.taobao.org/svn/【项目名称…

第5章 Python 数字图像处理(DIP) - 图像复原与重建2 - 瑞利噪声

标题瑞利噪声瑞利噪声 瑞利噪声的PDF为 P(z){2b(z−a)e−(z−a)2/b,z≥a0,z<a(5.4)P(z) \begin{cases} \frac{2}{b}(z-a)e^{-(z-a)^2/b}, & z \ge a \\ 0, & z < a\end{cases} \tag{5.4}P(z){b2​(z−a)e−(z−a)2/b,0,​z≥az<a​(5.4) 均值和方差为 zˉa…

调焦后焦实现不同距离成像_如何用手机拍出单反的效果,系列学习(一)AF参数“自动调焦”...

首先我们来了解下AF&#xff0c;AF在照相机中是英文Auto Focus的缩写&#xff0c;自动调焦的意思。因此&#xff0c;AF照相机即是自动调焦照相机的简称。   这种照相机的调焦是利用电子测距器自动进行的。当按下照相机快门按钮时&#xff0c;根据被摄目标的距离&#xff0c;电…

第5章 Python 数字图像处理(DIP) - 图像复原与重建3 - 爱尔兰(伽马)噪声

标题爱尔兰&#xff08;伽马&#xff09;噪声爱尔兰&#xff08;伽马&#xff09;噪声 爱尔兰噪声的PDF是 P(z){abzb−1(b−1)!e−az,z≥00,z<0(5.7)P(z) \begin{cases} \frac{a^bz^{b-1}}{(b-1)!}e^{-az}, & z\geq 0 \\ 0, & z < 0 \end{cases} \tag{5.7}P(z)…

ipfs如何查找一个文件的_如何用 1 分钟遍历一个 100TB 的文件?

如果你在面试的时候遇到这样一个问题&#xff1a;如何用 1 分钟遍历一个 100TB 的文件&#xff1f;是不是立刻就懵圈了&#xff1f;不要紧&#xff0c;读了今天的文章&#xff0c;懵圈的可能是面试官。以下是全文。文件及硬盘管理是计算机操作系统的重要组成部分&#xff0c;让…

calendar类计算时间距离_日期时间--JAVA成长之路

Java中为处理日期和时间提供了大量的API&#xff0c;确实有把一件简单的事情搞复杂的嫌疑&#xff0c;各种类&#xff1a;Date Time Timestamp Calendar...&#xff0c;但是如果能够看到时间处理的本质就可以轻松hold住这堆东西了。常用的类表示类java.util.Date :能够准确记录…

第5章 Python 数字图像处理(DIP) - 图像复原与重建4 - 指数噪声

标题指数噪声指数噪声 指数噪声的PDF为 P(z){ae−az,z≥00,z<0(5.10)P(z) \begin{cases} ae^{-az}, & z\geq 0 \\ 0, & z < 0 \end{cases} \tag{5.10}P(z){ae−az,0,​z≥0z<0​(5.10) 均值和方差为 zˉ1a(5.11)\bar{z} \frac{1}{a} \tag{5.11}zˉa1​(5.…

第5章 Python 数字图像处理(DIP) - 图像复原与重建5 - 均匀噪声

标题均匀噪声均匀噪声 均匀噪声的PDF为 P(z){1b−a,a≤z≤b0,other(5.13)P(z) \begin{cases}\frac{1}{b-a}, & a\leq z \leq b \\ 0, & \text{other}\end{cases} \tag{5.13}P(z){b−a1​,0,​a≤z≤bother​(5.13) 均值和方差为 zˉab2(5.14)\bar{z} \frac{a b}{2…

jquery实现的3D缩略图悬停效果

今天我们要告诉你如何创建一些令人兴奋的3D使用CSS3和jQuery悬停效果。这一想法的灵感来自于凉爽的悬停效果&#xff0c;再给客户做网站的时候用的这样的效果&#xff0c;今天就共享出来 在这个效果当中&#xff0c;我将使用的thumbails&#xff0c;就会发现一些更多的信息悬停…

python网页爬虫例子_Python 利用Python编写简单网络爬虫实例3

利用Python编写简单网络爬虫实例3 by:授客 QQ&#xff1a;1033553122 实验环境 python版本&#xff1a;3.3.5&#xff08;2.7下报错 实验目的 获取目标网站“http://bbs.51testing.com/forum.php”中特定url&#xff0c;通过分析发现&#xff0c;目标url同其它url的关系如下目标…

登陆SharePoint站点出现service unavailable----Http错误503

今天在登陆SharePoint站点时&#xff0c;遇到服务不可用&#xff0c;Http error 503。建议如下操作&#xff1a; 1. 在IIS中检查站点属性。在“起始页”&#xff0c;检查应用程序池。 2. 发现SharePoint Web Services Root已停止&#xff0c;右键启动。问题得到解决。 PS&#…

C# 数组

什么是数组&#xff1f;数组是一种数据结构&#xff0c;包含同一个类型的多个元素。数组的声明&#xff1a;int[] myIntArray; 注&#xff1a;声明数组时&#xff0c;方括号 ([]) 必须跟在类型后面&#xff0c;而不是变量名后面。在 C# 中&#xff0c;将方括号放在变量名后是不…

Downloading Android Source Code

Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制软件&#xff0c;它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓 库&#xff08;repository&#xff09;&#xff0c;许多个工作目录&#xff08…

第5章 Python 数字图像处理(DIP) - 图像复原与重建6 - 椒盐噪声

标题椒盐噪声椒盐噪声 如果kkk是一幅数字图像中表示灰度值的比特数&#xff0c;则灰度值可能是[0,2k−1][0, 2^k -1][0,2k−1]。椒盐噪声的PDF为&#xff1a; P(z){Ps,z2k−1Pp,z01−(PsPp),zV(5.16)P(z) \begin{cases} P_s, & z 2^k -1 \\ P_p, & z0 \\ 1-(P_s P_…