在计算机科学中,树(英语:树)是抽象数据类型(ADT)的数据结构或实现此抽象数据类型以使用树结构属性模拟数据集。它是由N(N> n>)组成的层次关系的集合0)有限的节点。它被称为“树”,因为它看起来像一棵倒的树,这意味着它是根和ye chao。
这是一个学术定义。简单的白话单词是树可以被视为一堆葡萄(自脑补充)。
这是一些在开发时经常会联系的树,只需进行分类:
节点中包含的子树的数量称为节点的树的程度。最大的节点称为零节点节点的节点的节点,没有零节点。如果一个节点包含一个子节点,则该节点称为子节点的父节点。节点节点中包含的根节点称为节点节点的节点。节点级别从根定义开始,root是第一层,而根的子节点是第二层。任何节点n,n,任何节点n的深度的深度,从根到n的长根,根的深度为0到0,任何节点n,n,n的高度是从n到n的最长路径一片叶子,所有叶子的高度是M的0森林(M> = 0)。只有两个子树(即,二进制树的2个节点)和二进制的子群树分为左右,然后订单不能倒置。
总共有一些常用的特性:
在这里,我们使用Golang作为二进制树的编程语言。原则是相同的。您也可以使用其他语言来实现它。这里
首先定义基本操作接口
然后定义二进制树的节点和操作实现类
初始化数据,此处构建的数据是第4部分中定义的二进制树
早期的准备工作已经完成,现在我们开始意识到二进制树的相关操作!
Golang的匿名功能用于修改共享变量以实现递归遍历。
6.2.1。以初步序列进行遍历的原理:如果二进制树是空的,则此操作为空;否则,访问根节点,左子树,右子树。
6.2.2。遍历序列遍历的原理:如果二进制树是空的,则此操作为空;否则,访问左子树,根节点和右子树。
这基本上与以前的序列遍历相同,即附加的位置不同。
6.2.3。晚期遍历原则:如果二进制树是空的,则此操作为空;否则,访问左子树,右子树和根节点。
6.3.1。执行图的前序列:执行过程在前后,中间和背面是相同的,区别在于获得数据序列的差异。
执行描述:这等同于将递归执行过程放在桌面上(递归,等效于将执行函数调用到函数调用堆栈中),堆栈中的堆栈等同于函数调用。
实施过程:
6.3.2。在序列遍历遍历遍历中,可追溯时需要获得数据。
6.3.3。随后的遍历遍历更麻烦。有必要确保将左和右子节点遍历以完成根节点。在这里,您需要添加指向堆栈指针的指针。
戏剧图:
这种遍历的水平也取决于队列的进步。
戏剧图:
递归实施!
如果没有递归,您还可以修改层次遍历以获得最大的深入获取。
从上面,您还可以看到二进制树不在顺序上,这是不同的。结合,插入和删除它在二进制树上。因此,以下介绍了各种二进制搜索树。
二进制搜索树的性质如下:
图中显示了典型的二进制搜索树:
二进制搜索树是从二进制树演变而来的,可以根据上面的二进制数扩展。
要构建二进制搜索树,我们需要注意二进制搜索树的性质。
此外,应注意的是,处理二进制搜索树的重复元素的处理。此处使用的基本数据类型并未以相同的方式插入相同的方式。但是,数据区域可能是对象的复杂数据类型。我们需要考虑通过增加附加区域将存储或存储存储到另一棵树上(这种情况在这里没有讨论过多的讨论)。
创建一个二进制搜索树以说是白色的,或者通过遍历找到节点。因此,在上面的二进制树的基础上,我们可以在遍历方法中进行一些修改。
目前,在7.1中构建一个二进制搜索树,如下:
此处的中序遍历是按大小顺序输出的!
给定数据搜索二进制搜索树的存在
二进制搜索树的结构可以非常简单,直到最左侧的节点是最小值,而右侧的节点是最大值。
这是删除底部节点的主要方法:
第一个删除情况:
第二个删除情况:
这里的操作更加麻烦,涉及四种情况,以下是一个一个人解释:
第一种情况:删除节点不存在左右儿童:可以直接删除这种情况
第二种情况:删除的节点存在剩余子:此时,让节点的父节点直接指向当前节点的左子女,然后删除当前节点;
第三种情况:删除节点存在于右子里:然后直接让节点的父节点指向当前节点的左子女,然后删除当前节点;
第四种情况:有左右儿童删除节点:找到右子树以找到最小的节点,交换当前节点的值,最后删除
代码:
随着节点的增加,当我们递归操作时,我们可能会堆叠溢出。上述操作更建议使用非记录写作。
另一个问题是二进制搜索树降解问题,请查看一个极端示例:
这种情况还符合二进制搜索树的条件。但是,目前,二进制搜索树已大约退化为链接列表。这样的二进制搜索树发现了发现时间的复杂性。知道我们不得让这一发生。为了解决此问题,我们可以使用平衡的二进制树(AVL)。