二叉排序树(搜索树)查找、增加、删除快速入门


前言

二叉排序树也叫二叉搜索树、二叉查找树,是二叉树的一种,但是二叉树的入门很简单,即使没有二叉树的基本,自己手写一个二叉排序树也可以做到,下面我们详细介绍以下二叉排序树的定义和三种最基本的操作——增、删、查。

在这里我们只谈思路、就不附上代码了。

一、定义

满是学究气息的文字定义我们先不看,还是沿用看图说话的惯例。
二叉排序树(搜索树)查找、增加、删除快速入门
数无形时少直觉,形少数时难入微”,所以文字上的定义也是不能少的,其实我们通过上图可以自己总结出来。

对于二叉树上的任意节点,若它的左子树不为空,那么左子树上所有节点的值均小于它的值,若它的右子树不为空,那么右子树上所有节点的值均大于它的值。

目的:构造一棵二叉排序树的目的,其实并不是为了排序,而是为了提高查找、增加和删除数据的速度。因为在一个有序的集合中查找数据的速度总是快于在无序集合中,而且二叉树排序树这种非线性的结构也有利于增加和删除节点(类似链表)。

二、查找

图一:初始状态,若查找80。
二叉排序树(搜索树)查找、增加、删除快速入门
图二:先遍历根节点,与80比大小,若大约根节点的数值(60),则向右移;否则向左移。
二叉排序树(搜索树)查找、增加、删除快速入门
图三:同理与75比较大小,若大于75则向右移;否则向左移。
二叉排序树(搜索树)查找、增加、删除快速入门
图四:这样我们就找了数值是80的这个节点。
二叉排序树(搜索树)查找、增加、删除快速入门

三、增加节点

增加节点的操作是以查找操作为基础的,分为两步。

第一步:找到自己的父节点;

第二步:与父节点比大小,决定成为该父节点的左子还是右子。

我们还以刚才的图为例。
图一:初始状态,若插入值为90的节点。
二叉排序树(搜索树)查找、增加、删除快速入门
图二:先遍历根节点,与90比大小,若大约根节点的数值(60),则向右移;否则向左移。
二叉排序树(搜索树)查找、增加、删除快速入门
图三:同理与75比较大小,若大于75则向右移;否则向左移。
二叉排序树(搜索树)查找、增加、删除快速入门
图四:到这里发现80已经没有子节点了,那么就选定他成为父节点。
二叉排序树(搜索树)查找、增加、删除快速入门
图五:与父节点比大小。大于父节点,成为父节点的右子。
二叉排序树(搜索树)查找、增加、删除快速入门

四、删除节点

“请佛容易送佛难”,要删除节点的话就没那么轻松了,因为要考虑到删除该节点后整个二叉树还满住二叉排序树的要求。一共有三种情况。

1.单身狗

即如下图中的深色节点,这个要删除的节点是一个可怜的单身狗。。。
二叉排序树(搜索树)查找、增加、删除快速入门
那么就把它直接删除!我们可以看到直接删除后对整个二叉树排序树并没有什么影响。

2.独生子

这个节点的后代虽然只有一棵独苗,但也是有的。
二叉排序树(搜索树)查找、增加、删除快速入门
当他驾崩后,这皇位要传给谁呢?当然是他的独生子69。而且我们把69放到62的位置发现二叉排序树的性质并没有被破坏,如下图。
二叉排序树(搜索树)查找、增加、删除快速入门
当然,若这颗独苗也有后代,情况是一样的。
二叉排序树(搜索树)查找、增加、删除快速入门

3.多子多孙

“哈哈哈哈!我可是多福多寿,多子多孙之人!”又来了一个节点。这个节点可是儿孙满堂,那么他驾崩后,“夺嫡”自然是不可避免的。
二叉排序树(搜索树)查找、增加、删除快速入门
30他驾崩了,留下了大好河山,宗室诸王们蠢蠢欲动,谁都想过一把皇帝瘾,经过一番比拼,发现25或者35都可以继承皇位,那就二者选其一吧。

“等等!怎么就25或者35了?”一个外国人不明所以地问道。原来在二叉排序树内部皇位的继承不是看谁最强而是看谁最像的。在30的众多子孙中只有25和35是最像他的(和他的差距最小)。

但是在实际操作中我们不一定要真的把30删掉,可以稍稍变通一下,先找到继承人将他的值赋给要删除的节点,再将继承人删除。

看到这里有些人不禁会想这个方法听上去简单,实际中要怎么用算法找到继承人呢?之后会与大家分享两句口诀,保证让大家按图索骥,顺利找到这两个节点。

(1)25继承

二叉排序树(搜索树)查找、增加、删除快速入门

口诀一:左转,向右到尽头。

我们再来看一个例子,如下图:
二叉排序树(搜索树)查找、增加、删除快速入门
注意:对于继承人来说他只有单身狗和左独生子这两种情况,不存在右独生子和多子多孙的情况,不明的话,再看看口诀就明白了,如果他存在右子,那么皇位还能轮到他继承吗?口诀可是向右到尽头!

(2)35继承

二叉排序树(搜索树)查找、增加、删除快速入门

口诀二:右转,向左到尽头。

同样我们再来看一个例子,如下图:
二叉排序树(搜索树)查找、增加、删除快速入门
注意:同理,对于第二种情况的继承人来说他只有单身狗和右独生子这两种情况,不存在左独生子和多子多孙的情况,如果他存在左子,就不是他继承皇位了。