数据结构树(Tree)详解

树(Tree)的基本概念

定义

树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构
例如:
树的结构与自然树是倒过来的
图 1(A) 是使用树结构存储的集合 {A,B,C,D,E,F,G,H,I,J,K,L,M} 的示意图。对于数据 A 来说,和数据 B、C、D 有关系;对于数据 B 来说,和 E、F 有关系。这就是“一对多”的关系。

将具有“一对多”关系的集合中的数据元素按照图 1(A)的形式进行存储,整个存储形状在逻辑结构上看,类似于实际生活中倒着的树(图 1(B)倒过来),所以称这种存储结构为“树型”存储结构。

树的结构

结点:使用树结构存储的每一个数据元素都被称为“结点”。例如,图 1(A)中,数据元素 A 就是一个结点;

父结点(双亲结点)、子结点和兄弟结点:对于图 1(A)中的结点 A、B、C、D 来说,A 是 B、C、D 结点的父结点(也称为“双亲结点”),而 B、C、D 都是 A 结点的子结点(也称“孩子结点”)。对于 B、C、D 来说,它们都有相同的父结点,所以它们互为兄弟结点。

树根结点(简称“根结点”):每一个非空树都有且只有一个被称为根的结点。图 1(A)中,结点A就是整棵树的根结点。
树根的判断依据为:如果一个结点没有父结点,那么这个结点就是整棵树的根结点。
叶子结点:如果结点没有任何子结点,那么此结点称为叶子结点(叶结点)。例如图 1(A)中,结点 K、L、F、G、M、I、J 都是这棵树的叶子结点。此外还有以下属性:

节点的度(degree):该节点子树的个数称为该节点的度。
树的度:所有节点中,度的最大值称为树的度。
非叶子节点:度不为零的节点。
高度(height):当前节点到最远叶子节点的路径长,所有树叶的高度为零。
深度(depth):对于任意节点n,n的深度为从根到n的唯一路径长。有些地方认为根深度为0,有些地方认为根深度为1。
兄弟节点:具有相同父节点的节点互相称为兄弟节点。
节点的层数(level):从根开始定义,根为第一层,根的子节点为第二层。以此类推。
堂兄弟节点:父节点在同一层的节点互为堂兄弟。
节点的祖先(ancestor):从根到该节点所经分支上的所有节点。
子孙(descendant):以某节点为根的子树中任一节点都称为该节点的子孙。
森林:由m(m >= 0)棵互不相交的树的集合称为森林。

一般来说数据结构如下(Java)


public class TreeNode<T> {
    public T value;
    public TreeNode<T> leftNode;
    public TreeNode<T> rightNode;
    //public List<TreeNode<T>> nodes;
}

二叉树

二叉树是每个节点最多有两个子树的树结构,左侧子树节点称为“左子树”(left subtree),右侧子树节点称为“右子树”(right subtree)。每个节点最多有2个子节点的树(即每个定点的度小于3)

二叉树的特点

至少有一个节点(根节点)

每个节点最多有两颗子树,即每个节点的度小于3。

左子树和右子树是有顺序的,次序不能任意颠倒。

即使树中某节点只有一棵子树,也要区分它是左子树还是右子树

满二叉树

除了叶子节点外每一个节点都有两个子节点,且所有叶子节点都在二叉树的同一高度上
满二叉树

完全二叉树

如果二叉树中除去底层节点后为满二叉树,且底层节点依次从左到右分布,则此二叉树被称为完全二叉树。

完全二叉树

二叉查找树(Binary Search Tree - BST,又称二叉排序树、二叉搜索树)

二叉查找树根节点的值大于其左子树中任意一个节点的值,小于其右子树中任意一节点的值,且该规则适用于树中的每一个节点。

二叉查找树
二叉查找树的查询效率介于O(log n)~O(n)之间,理想的排序情况下查询效率为O(log n),极端情况下BST就是一个链表结构(如下图),此时元素查找的效率相等于链表查询O(n)。

二叉查找树需要注意的是删除节点操作时的不同情况,删除节点根据节点位置会有以下三种情况:

删除节点的度为0,则直接删除

删除节点的度为1,则该子节点替代删除节点

删除节点的度为2,则从左子树中寻找值最大的节点替代删除节点。对树结构改动最少、节点值最进行删除节点值的必然是左子树中的最大叶子节点值与右子树中的最小叶子节点值
平衡二叉搜索树 (Balanced binary search trees,又称AVL树、平衡二叉查找树)

AVL树

AVL树是最早被发明的自平衡二叉搜索树,树中任一节点的两个子树的高度差最大为1,所以它也被称为高度平衡树,其查找、插入和删除在平均和最坏情况下的时间复杂度都是O(log n)。

平衡二叉搜索树由Adelson-Velskii和Landis在1962年提出,因此又被命名为AVL树。平衡因子(平衡系数)是AVL树用于旋转平衡的判断因子,某节点的左子树与右子树的高度(深度)差值即为该节点的平衡因子。

AVL树的特点

具有二叉查找树的特点(左子树任一节点小于父节点,右子树任一节点大于父节点),任何一个节点的左子树与右子树都是平衡二叉树

任一节点的左右子树高度差小于1,即平衡因子为范围为[-1,1] 如上左图根节点平衡因子=1,为AVL树;右图根节点平衡因子=2,固非AVL树,只是BST。
为什么选择AVL树而不是BST?

大多数BST操作(如搜索、最大值、最小值、插入、删除等)的时间复杂度为O(h),其中h是BST的高度。对于极端情况下的二叉树,这些操作的成本可能变为O(n)。如果确保每次插入和删除后树的高度都保持O(log n),则可以保证所有这些操作的效率都是O(log n)。

二叉树的存储结构

二叉树的存储结构有两种,分别为顺序存储和链式存储。本节先介绍二叉树的顺序存储结构。

二叉树的顺序存储:

指的是使用顺序表(数组)存储二叉树。需要注意的是,顺序存储只适用于完全二叉树。换句话说,只有完全二叉树才可以使用顺序表存储。因此,如果我们想顺序存储普通二叉树,需要提前将普通二叉树转化为完全二叉树。
有读者会说,满二叉树也可以使用顺序存储。要知道,满二叉树也是完全二叉树,因为它满足完全二叉树的所有特征。

普通二叉树转完全二叉树的方法很简单,只需给二叉树额外添加一些节点,将其"拼凑"成完全二叉树即可。如图 1 所示:
普通二叉树
左侧是普通二叉树,右侧是转化后的完全(满)二叉树。
完全二叉树的顺序存储,仅需从根节点开始,按照层次依次将树中节点存储到数组即可

在这里插入图片描述
上图的数组存储结构
存储由普通二叉树转化来的完全二叉树也是如此,例如上图普通二叉树,可以如此存储:
普通二叉树的顺序存储

二叉树的链式存储结构

普通二叉树
此为一棵普通的二叉树,若将其采用链式存储,则只需从树的根节点开始,将各个节点及其左右孩子使用链表存储即

链式存储结构

遍历二叉树的算法

遍历算法

层次遍历

前面讲过,树是有层次的,拿图 1 来说,该二叉树的层次为 3。通过对树中各层的节点从左到右依次遍历,即可实现对正棵二叉树的遍历,此种方式称为层次遍历。
层次遍历
代码实现:

 public static void leverErgodic(TreeNode root) {
   
        if (root == null) return;
        LinkedList<TreeNode<Integer>> list = new LinkedList<TreeNode<Integer>>();
        list.
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构和算法是计算机科学中非常重要的两个概念。数据结构是一种组织和存储数据的方式,而算法是解决问题的步骤和方法。在计算机科学中,有许多经典的数据结构和算法,被广泛应用于各种领域。 以下是十大经典数据结构和算法的简要介绍: 1. 数组(Array):是一种线性数据结构,可以存储相同类型的元素。数组的访问速度快,但插入和删除操作较慢。 2. 链表(Linked List):也是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。链表适用于频繁的插入和删除操作。 3. 栈(Stack):是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。 4. 队列(Queue):是一种先进先出(FIFO)的数据结构,只能在队尾插入,在队头删除。 5. (Tree):是一种非线性数据结构,由节点和边组成。有许多种类型,如二叉、平衡、堆等。 6. 图(Graph):也是一种非线性数据结构,由节点和边组成。图可以表示各种实际问题,如网络、社交关系等。 7. 哈希表(Hash Table):使用哈希函数将数据存储在数组中,可以快速查找、插入和删除数据。 8. 排序算法(Sorting Algorithm):如冒泡排序、插入排序、快速排序等,用于将数据按照某种规则进行排序。 9. 查找算法(Search Algorithm):如线性查找、二分查找等,用于在数据集中查找特定元素。 10. 图算法(Graph Algorithm):如最短路径算法(Dijkstra算法)、深度优先搜索算法(DFS)、广度优先搜索算法(BFS)等,用于解决图相关的问题。 以上是十大经典数据结构和算法的简要介绍,每个数据结构和算法都有其特点和适用场景,深入学习它们可以帮助我们更好地理解和解决实际问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值