数据结构--树

本文详细介绍了树的基本概念,包括双亲、孩子和兄弟关系,以及结点的度、层次和高度。重点讲解了二叉树的定义、性质,如满二叉树和完全二叉树,并探讨了二叉树的顺序和链式存储结构。还讨论了二叉树的遍历方法,包括先序、中序和后序遍历,以及线索二叉树的概念。最后,文章提到了最优二叉树(哈夫曼树)及其构造算法。

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

树结构是一种非线性结构,树中的一个元素可以有两个或两个以上的直接后继元素。

树的定义是递归的,即一棵树由若干棵子树构成,而子树又由更小的子树构成。

从数据结构的逻辑关系来看,树中元素之间还有严格的层次关系。对于树中的某节点,它最多只和上一层的一个节点(即双亲结点)有直接的关系,而与其下一层的多个结点(即孩子结点)有直接关系。

在这里插入图片描述

树的基本概念

双亲、孩子和兄弟

结点的子树的根称为该结点的孩子,该结点称为其子节点的双亲,具有相同双亲的结点互为兄弟,例如上图中B是A的孩子结点,A是B的双亲结点,B、C、D互为兄弟结点。

结点的度

一个结点的子树的个数记为该结点的度,例如上图中A的度为3,B的度为2。

叶子结点和内部结点

叶子结点也叫终端结点,指度为0的结点;内部结点是度不为0的结点。例如E、F、C、G都是叶子结点,A、B、D都是内部结点。

结点的层次

根为第一层,根的孩子为第二层,依次类推。例如上图树的层数为3,第一层是A,第二层是B、C、D,第三层是E、F、G。

树的高度

一棵树的最大层数记为树的高度(或深度)。

有序树

如果将树中的结点的各子树看成是从左到右具有次序的,即不能交换,则称该树为有序树,否则称为无序树。

二叉树

二叉树是特殊的树,它或者是空树,或者是由一个根结点及两棵不相交的且分别称为左、右子树的二叉树所组成。二叉树的定义也具有递归性质,即其子树也都是由左子树和右子树的二叉树组成。

注意:尽管树和二叉树的概念之间有许多联系,但它们是不同的概念,二叉树中的结点的子树要区分左子树和右子树,即使在结点只有一颗子树的情况下,也要明确指明该子树是左子树还是右子树。另外,二叉树结点的最大度为2,而树中不限制结点的度。
在这里插入图片描述
满二叉树:除终端结点外,每个结点的度都为2;

完全二叉树:深度为k、有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树,否则为非完全二叉树;

注意:在一个高度为h的完全二叉树中,除了第h层(即最后一层),其余各层都是满的。在第h层上的结点必须从左到右依次放置,不能留空。

二叉树的性质

(1)二叉树第i(i>=1)层上最多有在这里插入图片描述个结点(由等比数列的通项可得出)

(2)高度为k(k>=1)的二叉树最多有在这里插入图片描述个结点(由等比数列的求和公式可得出)

(3)对于任何一棵二叉树,若其终端结点数为n0,度为2的结点数为n2,则n0=n2+1

(4)具有n个结点的完全二叉树的深度为在这里插入图片描述(由第二条性质可得)

二叉树的存储结构

顺序存储

顺序存储是用一组地址连续的存储单元存储二叉树中的结点,必须把结点排成一个适当的线性序列,并且结点在这个序列中的相互位置能反应出结点之间的逻辑关系。

假设有一棵结点数为n的树和编号为i的结点:

(1)若i=1,则该结点为跟结点,没有双亲结点;若i>1,则该结点的双亲结点为[i/2];

(2)若2i<=n,则该结点的左孩子结点为2i,否则无左孩子;

(3)若2i+1<=n,则该结点的右孩子的结点为2i+1,否则无右孩子。

显然,完全二叉树采用顺序存储结构既简单又节省空间,对于一般的二叉树,则不宜采用顺序存储结构。因为一般的二叉树也必须按照完全二叉树的形式存储,也就是要添加一些实际并不存在的“虚节点”,这将造成空间浪费。如下图所示:
在这里插入图片描述
链式存储

由于二叉树的结点包含有数据元素、左子树的根、右子树的根及双亲等信息,因此可以用三叉链表或二叉链表(即一个节点含有3个指针或2个指针)来存储二叉树,链表的头指针指向二叉树的根结点。
在这里插入图片描述

二叉树的遍历

遍历是按某种策略访问树中的每个节点,且仅访问一次的过程。由于二叉树所具有的递归性质,一棵非空的二叉树是由跟结点、左子树和右子树三部分组成的,因此若能依次遍历这三部分,也就遍历了整棵二叉树。

按照先遍历左子树后遍历右子树的约定,根据访问根结点位置的不同,可得到二叉树的先序、中序和后序三种遍历方法,此外还有层序遍历。

先序遍历:先访问根结点,再先序遍历根结点的左子树,后先序遍历根结点的右子树;

中序遍历:先中序遍历根结点的左子树,再访问根结点,后中序遍历根结点的右子树;

后序遍历:后序遍历根结点的左子树,再后序遍历根结点的右子树,后访问根结点。

例如,分别按先序、中序和后序遍历下面这棵二叉树:
在这里插入图片描述
先序:ABDHIECFG
中序:HDIBEAFCG
后序:HIDEBFGCA

遍历二叉树的基本操作就是访问结点,不论按哪种次序遍历,对于含有n个结点的二叉树,遍历算法的时间复杂度都为O(n)。因为在遍历的过程中,每进行一次递归调用,都是将函数的“活动记录”压入栈中,因此,栈的最大长度恰为树的高度,所以在最坏的情况下,二叉树是有n个结点且高度为n的单树枝,遍历算法的空间复杂度为O(n)

注意:遍历二叉树的过程实际上是按一定的规则将树中的结点排成一个线性序列的过程,因此遍历操作得到的是树中结点的一个线性序列。

线索二叉树

二叉树的遍历实际上是对一个非线性结构进行线性化的过程,它使得每个结点(除第一个和最后一个)在这些线性序列中有且仅有一个直接前驱和直接后继。但在二叉链表存储结构中,只能找到一个节点的左、右孩子,不能直接得到结点在任一遍历序列中的前驱和后继,这些信息在只有在遍历的动态过程中才能得到。

因此,引入线索二叉树来保存结点的前驱和后继信息,线索二叉树的二叉链表存储结构如下:
在这里插入图片描述
若二叉树的二叉链表采用以上所示的结点结构,则相应的链表称为线索链表,其中指向结点前驱、后继的指针称为线索。加上线索的二叉树称为线索二叉树。

对二叉树以某种次序遍历使其成为线索二叉树的过程称为线索化,实质上是在遍历的过程中用线索取代空指针。

最优二叉树

最优二叉树又叫哈夫曼树,它是一类带权路径长度最短的树

路径是从树中一个结点到另一个结点之间的通路,路径上的分支数目称为路径长度。树的路径长度是从树根到每一个叶子结点之间的路径长度之和。

结点的带权路径长度为从该结点到树根之间的路径长度与该结点权值的乘积。树的带权路径长度为树中所有叶子结点的带权路径长度之和,记为
在这里插入图片描述
哈夫曼树是指权值为w1,w2,……,wn的n个叶子结点的二叉树中带权路径长度最小的二叉树。例如下面具有4个叶子结点的二叉树中(b)所示的二叉树带权路径长度最小。
在这里插入图片描述
构造最优二叉树的哈夫曼算法:

(1)根据给定的n个权值{w1,w2,……,wn},构成n棵二叉树的集合F={T1,T2,……,Tn},其中,每棵树Ti中只有一个带权为wi的根结点,其左、右子树均为空。

(2)在F中选取两棵权值最小的树作为左、右子树构造一棵新的二叉树,置新构造二叉树的根结点的权值为其左、右子树根结点的权值之和。

(3)从F中删除这两棵树,同时将新得到的二叉树加入到F中。

重复(2)、(3)步,直到F中只含一棵树时为止,这棵树便是最优二叉树(哈夫曼树)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值