什么是树?多种树结构详解

树的定义和术语

树是由零个或多个结点组成的具有层级关系的数据结构。

当树的结点数量等于零时,称为空树。当树的结点数量大于零时,定义以下术语:根结点、叶结点、父结点、子结点、子树。

  • 树中有一个唯一的根结点。

  • 每个结点有零个或多个子结点,没有子结点的结点称为叶结点。

  • 根结点没有父结点,除了根结点以外的每个结点有且只有一个父结点。

  • 父结点和子结点是相对关系,甲结点是乙结点的父结点等价于乙结点是甲结点的子结点。

  • 对于父结点而言,以子结点为根结点的树称为父结点的子树。

根据父结点和子结点的定义,还可以定义兄弟结点、堂兄弟结点、祖先和后代。

  • 如果两个结点的父结点相同,则这两个结点为兄弟结点。

  • 如果两个结点的父结点不同且位于同一层,则这两个结点为堂兄弟结点。

  • 如果以结点甲为根的子树中存在结点乙,则结点甲是结点乙的祖先,结点乙是结点甲的后代。

由于树中的结点之间存在层级关系,因此还需要定义树中的边、结点的层级以及树的层级和树的高度。层级和高度的定义取决于具体场景。

  • 当且仅当两个结点之间的关系是父结点和子结点的关系时,两个结点之间有一条边相连。

  • 根结点所在层定义为第 0 层或第 1 层。如果两个结点之间的关系是父结点和子结点的关系,则子结点的层数为父结点的层数加 1。

  • 树的层级定义为树中结点所在的不同层级的数量,为最远叶结点的层数和根结点的层数之差加 1。

  • 树的高度可以定义为:树的层级;从根结点到最远叶结点的路径上的边数;从根结点到最远叶结点的路径上的结点数。

由于树中的每一条边一定连接父结点和子结点,因此树中不存在环。在树中任选两个结点,这两个结点之间的路径一定是唯一的。

树的遍历

树的遍历指的是按照特定顺序依次访问树中的每个结点,使得每个结点恰好被访问一次。树的遍历可以分成两大类,基于深度优先搜索的遍历和基于广度优先搜索的遍历。

深度优先搜索的方法为:从根结点开始,对于每个可能的分支路径深入搜索下一个结点,遇到叶结点时,回退到上一个结点并对其余的分支路径继续搜索,直到遍历完所有可能的分支路径。深度优先搜索基于栈实现,可以通过递归的方式或者显性使用栈的方式实现。

广度优先搜索的方法为:从根结点开始,依次遍历每一层的结点,直到遍历完最后一层的结点。广度优先搜索基于队列实现。

二叉树和多叉树部分将会具体介绍树的遍历方法。

树的种类

树的种类有很多,以下列举常见的树。

  • 二叉树:最常见的树结构,树中的每个结点最多有两个子结点,两个结点分别为左子结点和右子结点。特殊的二叉树包括二叉搜索树、完全二叉树、满二叉树、哈夫曼树等。

  • 多叉树:最一般化的树结构,树中的每个结点可以有任意个子结点。

  • B 树:多叉树的一种,也称平衡多路搜索树,适用于磁盘和其他存储设备。B 树的两个常见的变种是 B+ 树和 B* 树。

  • 字典树:也称前缀树,为多叉树的一种,可以用于字符串的检索,其使用空间小于哈希表。字典树将在高级数据结构部分具体讲解。

二叉树

二叉树是最常见的树结构。二叉树中的每个结点最多有两个子结点,且子结点有左右之分。

在 LeetCode 中定义了 TreeNode 类,该类定义了二叉树的一个结点。TreeNode 类的 Java 代码定义如下:

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode() {}
    TreeNode(int val) { this.val = val; }
    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

二叉树的遍历有四种:前序遍历、中序遍历、后序遍历和层序遍历。其中,前序遍历、中序遍历和后序遍历基于深度优先搜索,层序遍历基于广度优先搜索。

  • 前序遍历的方法为:依次遍历根结点、左子树和右子树,对于左子树和右子树使用同样的方法遍历。

  • 中序遍历的方法为:依次遍历左子树、根结点和右子树,对于左子树和右子树使用同样的方法遍历。

  • 后序遍历的方法为:依次遍历左子树、右子树和根结点,对于左子树和右子树使用同样的方法遍历。

  • 层序遍历的方法为:从根结点开始,依次遍历每一层的结点。

前序遍历、中序遍历和后序遍历可以使用递归和迭代的方式实现,时间复杂度是 O(n),空间复杂度是 O(n),其中 n 是二叉树的结点数,也可以使用莫里斯遍历实现,时间复杂度是 O(n),空间复杂度是 O(1)。

在二叉树中,一个元素也称作一个结点。当集合为空时,称该二叉树为空二叉树。 

AVL 树

AVL 树是平衡二叉搜索树,由两名前苏联的科学家 G. M. Adelson-Velsky 和 E. M. Landis 提出,根据两名科学家的名字命名。AVL 树具有以下性质。

  • 空二叉搜索树是 AVL 树。

  • 根结点的左子树和右子树的高度之差的绝对值不超过 1。

  • 根结点的左子树和右子树也是 AVL 树。

AVL 树中的每个结点都有一个平衡因子,一个结点的平衡因子定义为该结点的左子树和右子树的高度之差,AVL 树满足每个结点的平衡因子的绝对值都不超过 1。在插入和删除操作时,需要通过旋转操作维护 AVL 树的平衡性。

红黑树

红黑树是近似平衡的二叉搜索树,具有以下性质。

  • 每个结点是黑色或红色。

  • 根结点是黑色。

  • 所有的叶结点都是黑色,红黑树中的叶结点为空结点。

  • 每个红色结点的子结点都是黑色。

  • 从任意一个结点出发,到其子树中的每个叶结点的所有路径都包含相同数目的黑色结点。

下图为一个红黑树。

在插入和删除操作时,需要通过旋转和着色操作维护红黑树的性质。

由于红黑树中没有平衡因子,因此红黑树不像 AVL 树严格平衡,但是和 AVL 树相比,维护红黑树性质的代价较低,因此在各项操作的平均性能方面,红黑树优于 AVL 树。

 

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值