排序二叉树(概念性)了解一下

基本概念

树的基本概念,在计算机程序中,树是从上往下长的,也会有分叉,有个根节点,每个节点可以有一个或多个节点,没有孩子节点的节点一般称为叶子节点。

二叉树是一棵树,每个节点最多有两个孩子节点,一左一右,左边的称为左孩子,右边的称为右孩子。

排序二叉树,也是二叉树,它没有重复元素,而且是有序的二叉树,对每个节点
如果左子树不为空,则左子树上的所有节点都小于该节点;
如果右子树不为空,则右子树上的所有节点都大于该节点。

在这里插入图片描述

基本算法

1.查找

排序二叉树有一个很好的优点,在其中查找一个元素时很方便,也很高校,基本步骤为:
(1) 首先与根节点比较,如果相同,就找到了;
(2) 如果小于根节点,则到左子树中递归查找;
(3)如果大于根节点,则到右子树中递归查找。
此外,在排序二叉树中,可以方便地查找最小值和最大值。最小值即为最左边的节点,从根节点一路查找左孩子即可;最大值即为最右边的节点,从根节点一路查找右孩子即可。

2.遍历

排序二叉树也可以方便地按序遍历。用递归的方式,用如下算法即可按序遍历:
(1)访问左子树;
(2)访问当前节点;
(3)访问右子树

从根节点开始,但先访问根节点的左子树,一直到最左边的节点,所以第一个访问的是1,1没有右子树,返回上一层,访问3,然后访问3的右子树,4没有左子树,所以访问4,然后是4的右子树6,以此类推,访问顺序是有序的:1,3,4,6,7,8,9.
在这里插入图片描述
不用递归的方式,也可以实现按序遍历,第一个节点为最左边的节点,从第一个节点开始,依次找后继节点,找其后继节点算法为:
(1) 如果有右孩子,则后继节点为右子树中最小的节点。
(2)如果没有右孩子,后继节点为父节点或某个祖先节点,从当前节点往上找,如果它是父节点的右孩子,则继续找父节点,直到它不是右孩子或父节点为空,则第一个非右孩子节点的父节点就是后继节点,如果父节点为空,则后继节点为null。
文字描述比较抽象,看图说话:
在这里插入图片描述

详细解释:黄色线表示后继节点
(1)第一个节点1没有右孩子,它不是父节点的右孩子,所以它的后继节点就是其父节点3;
(2)3有右孩子,右子树中只有一个节点6,所以3的后继节点为4;
(3)4有右孩子,右子树中只有一个节点6,所以4的后继节点为6;
(4)6没有右孩子,往上找父节点,它是父节点4的右孩子,4又是父节点3的右孩子,3不是父节点7的右孩子,所以6的后继节点为3的父节点7;
(5)7有右孩子,右子树中最小值是8.所以7的后继节点为8;
(6)8没有右孩子,往上找父节点,它不是父节点9的右孩子,所以它的后继节点就是其父节点9;
(7)9没有右孩子,往上找父节点,它是父节点7的右孩子,接着往上找,但7已经是根节点,父节点为空,则后继为null。

3.插入

在排序二叉树中,插入元素首先要找插入位置,即新节点的父节点,怎么找呢?与查找元素类似,从根节点开始往下找,其步骤为:
(1) 与当前节点比较,如果相同,表示已经存在了,不能再插入;
(2) 如果小于当前节点,则到左子树中寻找,如果左子树为空,则当前节点即为要找的父节点;
(3) 如果大于当前节点,则到右子树中寻找,如果右子树为空,则到当前节点即为要找的父节点。
找到父节点后,即可插入,如果插入元素小于父节点,则作为左孩子插入,否则作为右孩子插入。

我们看个例子,依次插入7,3,4,1,9,6,8的过程
在这里插入图片描述

4.删除

从排序二叉树中删除一个节点要复杂一些,有三种情况:
(1)节点为叶子节点;
(2)节点只有一个孩子节点;
(3)节点有两个孩子节点。

如果节点为叶子节点,则很简单,可以直接删掉,修改父节点的对应孩子节点为空即可。

如果节点只有一个孩子节点,则替换待删节点为孩子节点,或者说,在孩子节点和父节点直接建立链接。
在这里插入图片描述

如果节点有两个孩子节点,则首先找该节点的后继节点,找到后继节点后,替换待删节点为后继节点的内容,然后再删除后继节点,后继节点没有左孩子,这就将两个孩子节点的情况转换为叶子节点或只有一个孩子节点的情况。
在这里插入图片描述

平衡的排序二叉树

从前面的描述中可以看出,排序二叉树的形状与插入和删除的顺序密切相关,极端情况下,排序二叉树可能退化为一个链表。比如,如果插入顺序为1, 3,4,6,,7,9
在这里插入图片描述

平衡具体定义是什么呢?
有一种高度平衡的定义,即任何节点的左右子树的高度差最多为一,满足这个平衡定义的排序二叉树又被称为AVL,在他们算法中,在插入和删除节点时,通过一次或多次旋转操作来重新平衡树。
在TreeMap的实现中,用的并不是AVL树,而是红黑树,红黑树也是插入和删除节点时通过旋转操作来平衡的,但它并不是高度平衡,而是大致平衡,是指,它确保任意一条从根到叶子节点的路径,没有任何一条路径的长度会比其他路径长过两倍。红黑树减弱了平衡的要求,但降低了保持平衡需要的开销。在实际应用中,统计性能高于AVL树。

为什么叫红黑树呢?因为它对每个节点进行着色,颜色或黑或红,并对节点的着色有一些约束,满足这个约束即可以确保树是大致平衡的。大致平衡的目的是为了保证树的查找效率。

与哈希表一样,树也是计算机程序中的一种重要的数据结构和思维方式,为了能够快速操作数据,哈希和树是两种基本的思维方式,不需要顺序,优先来考虑哈希,需要顺序,考虑树,除了容器类TreeMap/TreeSet,数据库中的索引结构也是基于树的(不过基于B树,而不是二叉树),而索引是能够在大量数据中快速访问数据的关键。

参考文章

java编程的逻辑基础(马俊昌)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章