数据结构-树的简介

本文深入解析树这一数据结构,涵盖树的基本概念、特点、术语及其多种类型,包括无序树、有序树、二叉树、平衡二叉树等。同时介绍了树的三种表示方法:图像表示法、符号表示法及遍历表示法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概要

本文介绍数据结构中的树。
在这里插入图片描述

1. 树的基本概念

1.1 树的定义

树状图是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

具体来说,树是由根节点和若干颗子树构成的。从集合的角度来说,树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的节点,所定义的关系称为父子关系。父子关系在树的节点之间建立了一个层次结构。在这种层次结构中有一个节点具有特殊的地位,这个节点称为该树的根节点,或称为树根。

如果使用递归的方式定义如下

  1. 单个节点是一棵树,树根就是该节点本身。
  2. 设T1,T2,…,Tk是树,它们的根节点分别为n1,n2,…,nk。用一个新节点n作为n1,n2,…,nk的父亲,则得到一棵新树,节点n就是新树的根。我们称n1,n2,…,nk为一组兄弟节点,它们都是节点n的子节点。我们还称T1,T2,…,Tk为节点n的子树。
  3. 空集合也是树,称为空树。空树中没有节点。

1.2 树的特点

它具有以下的特点:

  • 每个节点有零个或多个子节点;
  • 没有父节点的节点称为根节点;
  • 每一个非根节点有且只有一个父节点;
  • 除了根节点外,每个子节点可以分为多个不相交的子树;

1.3 树中术语

术语
含义
节点树集合中的每一个元素,都称为节点。
在关系划分中,有父节点、子节点、兄弟节点、祖先节点、后代节点、根节点、叶节点(终端节点)、分支节点(非终端节点)等等
父节点若一个节点含有子节点,则这个节点称为其子节点的父节点。
子节点一个节点含有的子树的根节点称为该节点的子节点。
兄弟节点具有相同父节点的节点互称为兄弟节点。
堂兄弟节点双亲在同一层的节点互为堂兄弟
祖先节点对任意节点x,从根节点到节点x的所有节点都是x的祖先(节点x也是自己的祖先)
后代节点对任意节点x,从节点x到叶子节点的所有节点都是x的后代(节点x也是自己的后代)
根节点没有父节点的节点
叶节点没有子节点的节点
分支节点既有父节点,又有子节点的节点
-
-
节点的度一个节点含有的子树的个数称为该节点的度
节点深度对任意节点x,x节点的深度表示为根节点到x节点的路径长度。
所以根节点深度为0,第二层节点深度为1,以此类推。即节点深度是节点层次数减一。
节点的层次一棵树的根节点层次为1,其他节点的层次是其父节点层次加1
树的度一棵树中,最大的节点的度称为树的度
树的深度一棵树中节点的最大深度就是树的深度,也称为高度
森林m颗互不相交的树构成的集合就是森林

其实对于祖先和后代的定义,不同的资料有不同的解释,争论在于节点本身是否是本身的祖先或者后代

2. 树的类型

基于树的不同特性,可以设计出许多不同种类的树,下面罗列一些常见的树的类型:

类型
说明
无序树树的任意节点的子节点没有顺序关系。也叫自由树
有序树树的任意节点的子节点有顺序关系。
二叉树树的任意节点至多包含两棵子树。
满二叉树叶子节点都在同一层并且除叶子节点外的所有节点都有两个子节点。
完全二叉树对于一颗二叉树,假设其深度为d(d>1)。除第d层外的所有节点构成满二叉树,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树;(不同于国外定义
平衡二叉树(AVL树)它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树。
二叉查找树(二叉搜索树、BST)若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
任意节点的左、右子树也分别为二叉查找树;
没有键值相等的节点。
霍夫曼树带权路径最短的二叉树称为哈夫曼树或最优二叉树。
红黑树红黑树是一颗特殊的二叉查找树,除了二叉查找树的要求外,它还具有以下特性:
  每个节点或者是黑色,或者是红色。
  根节点是黑色。
  每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
  如果一个节点是红色的,则它的子节点必须是黑色的。
  从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点
B-tree(B-树或者B树)
B+树

计算机科学中的树如下图所示:百度百科-二叉树
百度百科-二叉树
在这里插入图片描述

3. 树的表示

3.1 图像表示法

3.2 符号表示法

用括号先将根节点放入一对圆括号中,然后把它的子树由左至右的顺序放入括号中,而对子树也采用同样的方法处理;同层子树与它的根节点用圆括号括起来,同层子树之间用逗号隔开,最后用闭括号括起来。如前文树形表示法可以表示为:(1(2(5(9,10)),3(6,7),4(8)))

3.3 遍历表示法

遍历表达法有3种方法:先序遍历、中序遍历、后序遍历
例如下图:
在这里插入图片描述
其先序遍历为ABDECF
其中序遍历为DBEAFC
其后序遍历为DEBFCA

致谢

### Java 中红黑数据结构实现与应用 #### 红黑简介 红黑是一种自平衡二叉查找,在计算机科学中用于高效地存储和检索键值对。该数据结构的特点在于其能够自动调整节点位置来维持一定的平衡条件,从而保证最坏情况下的时间复杂度为 O(log n)[^1]。 #### 平衡特性对比 相较于 AVL 而言,尽管两者都致力于维护二叉查找的高度接近于最小可能高度,但是由于红黑对于旋转次数的要求较低,因此在频繁发生插入或删除的情况下表现更优;而像 `TreeMap` 和 `TreeSet` 这样的集合类正是利用这一点实现了高效的增删改查功能[^2]。 #### 关键属性定义 为了满足上述提到的性质,每棵红黑中的结点除了拥有指向左右子以及父辈指针外还需要额外记录颜色信息(红色/黑色),具体如下所示: ```java private static final boolean RED = false; private static final boolean BLACK = true; static class Node<K,V> { K key; // 存储的关键字 V value; // 对应关键字所映射的对象 Node<K,V> left; // 左孩子引用 Node<K,V> right; // 右孩子引用 Node<K,V> parent;// 父亲引用 boolean color; // 颜色标记 public Node(K key, V value, Node<K,V> parent){ this.key=key; this.value=value; this.parent=parent; this.color=RED; // 新加入的节点默认设为红色 } } ``` #### 插入操作逻辑 当向一棵已有的红黑内添加新元素时,会先按照普通的 BST 方式找到合适的位置并创建新的叶子节点。之后再依据一系列规则判断是否需要执行重涂色或是旋转变换以恢复整棵应有的形态特征。 - 如果当前新增加的是根,则直接将其变为黑色; - 若祖父存在且叔叔也为红色,则将父亲、叔叔均改为黑色并将祖父变更为红色继续向上处理; - 当仅有单侧兄弟呈红色状态时可通过一次左(右)转使得双亲成为临时性的“假”根以便后续统一调整; - 剩余情形下只需简单交换父子间染色即可完成修复工作。 以上过程可以概括成一段伪代码形式表示出来: ```pseudo function insertFixup(node) if node is root then set its color to black and return. while (node != null && node's parent is red) // 处理违反红黑特性的几种场景... end while ``` 实际上完整的算法较为复杂,涉及到多个分支路径的选择问题,这里仅给出大致思路供理解参考之用。 #### 删除操作概述 移除某个指定项的过程同样遵循着相似的原则——即先依照普通二叉搜索的方式定位目标对象所在位置,并考虑三种不同类型的状况分别采取相应的措施加以应对:如果待消除的目标恰好处于末端处那么可以直接摘掉它而不影响其他部分;反之则需寻找合适的替代品填补空缺后再做进一步讨论。 值得注意的是在整个过程中可能会引入一些暂时不符合标准的情况,这就要求我们及时作出必要的修正动作直至最终达到稳定为止。 #### 应用实例分析 正如前面提及的一样,红黑广泛应用于各种编程语言的标准库当中作为内部机制支撑起诸如有序表之类的抽象容器类型。例如在 JDK8 版本以后版本里头,`HashMap` 的链地址法解决哈希冲突方案便采用了基于红黑优化后的链表结构,以此提高极端情况下访问效率的同时兼顾了空间利用率方面的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值