树 (数据结构)2025年4月20日 | 阅读 15 分钟 引言我们学习了线性数据结构,如数组、链表、栈和队列,其中所有元素都按顺序排列。有些数据组织需要将数据分类到组和子组中。不同的数据结构用于不同的数据类型。 选择数据结构时会考虑一些因素
什么是树数据结构?树是由有限个节点组成的集合,其中有一个特殊的节点称为根节点,其余节点可以被分成零个、一个或多个不相交的子集,每个子集本身也是一棵树,称为T的子树。 假设我们想以层级形式显示员工及其职位,则可以如下所示表示: ![]() 上图显示了一家公司某部门的组织层级。在上述结构中,john是公司的CEO,John有两名直接下属,名为Steve和Rohan。Steve有三名直接下属,名为Lee, Bob, Ella,其中Steve是经理。Bob有两名直接下属,名为Sal和Emma。Emma有两名直接下属,名为Tom和Raj。Tom有一名直接下属,名为Bill。这种特定的逻辑结构称为树。其结构与真实树相似,因此称为树。在此结构中,根位于顶部,其分支向下延伸。因此,我们可以说树数据结构是一种以层级方式存储数据的有效方法。 让我们来了解树数据结构的一些关键点。
树数据结构中使用的一些基本术语。 让我们考虑下面显示的树结构 ![]() 在上述结构中,每个节点都用字母标记。图中的每条箭头都称为两个节点之间的链接。
![]() 在上面的例子中,A、B、C 等都是树的节点。
![]() 在上面的图示表示中,我们看到了节点之间的各种边。例如:顶点 A 和顶点 C 之间的边,顶点 B 和顶点 D 之间的边等等。
![]() 在上面的例子中,任何节点的后代都显示了子节点。例如:节点 G、节点 K 是节点 D 的子节点,也是节点 B 的子节点。G 和 H 是节点 C 的左子节点和右子节点。
![]() 在上面的例子中,任何节点的祖先都显示为父节点。例如:节点 A、节点 B 和节点 G 等都是父节点。
![]() 在上面的例子中,显示了拥有相同父节点的节点称为兄弟节点。例如:节点 G 和节点 H 是兄弟节点。
![]() 在上面的例子中,显示了各种叶节点,如节点 D、F、K 等。
![]() 在上面的例子中,显示了各种内部节点,如节点 A、B、C、G 等。
![]() 在上面的图示表示中,我们看到了从起点到终点的各种节点的度。例如:节点 K 的度为 0,节点 E 的度为 1 等。
![]()
![]() 上述图示表示显示了从根节点(即层级 0)开始的层级 3。
![]() 在上面的例子中,从节点 A 到节点 J 的路径是“A - B - E - J”,路径长度为 4。 树数据结构的属性
根据树数据结构的属性,树分为各种类别。 树的实现可以通过使用指针动态创建节点来创建树数据结构。内存中的树表示如下所示: ![]() 上图显示了内存中树数据结构的表示。在上图中,节点包含三个字段。第二个字段存储数据;第一个字段存储左子节点的地址,第三个字段存储右子节点的地址。 在编程中,节点的结构可以定义为 上述结构只能为二叉树定义,因为二叉树最多可以有两个子节点,而通用树可以有多个子节点。通用树的节点结构将与二叉树不同。 树的应用以下是树的应用
树数据结构类型以下是树数据结构的类型
节点可以通过称为struct的用户定义数据类型创建,如下所示 以上是带有三个字段的节点结构:数据字段,第二个字段是节点类型的左指针,第三个字段是节点类型的右指针。 要了解更多关于二叉搜索树的信息,请点击下面的链接 它是二叉树的一种,或者我们可以说它是二叉搜索树的一个变体。AVL 树同时满足二叉树和二叉搜索树的属性。它是一种自平衡二叉搜索树,由Adelson Velsky Lindas发明。这里的自平衡意味着平衡左子树和右子树的高度。这种平衡通过平衡因子来衡量。 如果我们考虑一棵树是 AVL 树,那么这棵树就遵循二叉搜索树以及平衡因子。平衡因子可以定义为左子树高度与右子树高度之差。平衡因子的值必须是 0、-1 或 1;因此,AVL 树中的每个节点的平衡因子值都必须是 0、-1 或 1。 要了解更多关于 AVL 树的信息,请点击下面的链接 红黑树是二叉搜索树。红黑树的前提是我们应该了解二叉搜索树。在二叉搜索树中,左子树的节点值应该小于该节点的值,而右子树的节点值应该大于该节点的值。正如我们所知,二分查找在平均情况下的时间复杂度是 log2n,最佳情况是 O(1),最坏情况是 O(n)。 当在树上执行任何操作时,我们希望我们的树是平衡的,以便所有操作如搜索、插入、删除等都能花费更少的时间,并且所有这些操作的时间复杂度都将是log2n。 红黑树是一种自平衡二叉搜索树。AVL 树也是一种高度平衡的二叉搜索树,那么为什么我们需要红黑树?在 AVL 树中,我们不知道需要多少次旋转才能平衡树,但在红黑树中,最多需要 2 次旋转才能平衡树。它包含一个额外的位,用于表示节点的红色或黑色,以确保树的平衡。
伸展树数据结构也是一种二叉搜索树,其中最近访问的元素通过执行一些旋转操作被放置在树的根节点位置。这里的伸展意味着最近访问的节点。它是一种自平衡二叉搜索树,没有像AVL树那样的显式平衡条件。 伸展树的高度可能不平衡,即左右子树的高度可能不同,但伸展树中的操作花费的时间复杂度是logN,其中n是节点数。 伸展树是一种平衡树,但它不能被认为是高度平衡树,因为每次操作后都会执行旋转,从而导致一棵平衡树。
Treap 数据结构来自树和堆数据结构。因此,它包含了树和堆数据结构的属性。在二叉搜索树中,左子树的每个节点必须等于或小于根节点的值,右子树的每个节点必须等于或大于根节点的值。在堆数据结构中,左右子树都包含大于根节点的键;因此,我们可以说根节点包含最小值。 在 treap 数据结构中,每个节点都有键和优先级,其中键来自二叉搜索树,优先级来自堆数据结构。 Treap 数据结构遵循两个属性,如下所示:
B 树是一种平衡的m 路树,其中m定义了树的阶数。到目前为止,我们了解到节点只包含一个键,但 b 树可以包含多个键和多个子节点。它始终维护排序数据。在二叉树中,叶节点可能位于不同的层级,但在 b 树中,所有叶节点必须位于同一层级。 如果阶数为 m,则节点具有以下属性:
根节点必须包含最少 1 个键,所有其他节点至少必须包含向上取整的 m/2 减 1 个键。 关于树数据结构的填空题1. 下列哪项是非线性数据结构?
答案:B 说明 树是一种非线性数据结构。 2. AVL 树是一种二叉搜索树,其中每个节点都有一个平衡因子?
答案:D 说明 为了进行高效搜索,二叉搜索树的构建方式使其高度平衡。这种树称为高度平衡树或 AVL 树。其中每个节点的平衡因子 (b) 为 1, 0, -1。 3. 二叉树的前序遍历是 a, B, D, E, H, I, C, F。该树的顺序遍历是?
答案:A 说明 二叉树的中序遍历会生成一个排序列表。中序遍历将产生以下节点顺序 D, B, G, E, H, I, A, C, F 4. 高度为 h 的二叉树可能拥有的最少节点数是多少?
答案:D 说明 如果二叉树的高度为 1,则二叉树中的最少节点数为 1 + 1,即 2。 5. 在 B 树中,每个节点最多可以有多少个子节点(键值对)?
答案:A 说明 B 树中的叶节点最多包含 (m-1) 个键值对。 6. 堆树是一种完全二叉树,其中任何节点存储的数据值?
答案:D 说明 堆树是一种完全二叉树,因此在使用数组实现时空间效率很高。存储在节点中的数据值大于或等于子节点的值。 下一个主题二叉树 |
我们请求您订阅我们的新闻通讯以获取最新更新。