树的周边(一)树的概念

本文详细介绍了树这种层次性数据结构,包括树的基本概念、二叉树(满二叉树/完全二叉树)、最优二叉树(霍夫曼树)、次优二叉树以及几种重要的特殊树型:二叉查找树、平衡树(AVL树)和B树/B+树。特别提到了红黑树,它是关联数组实现的基础,插入和删除操作复杂但保持了O(log n)的时间复杂度。

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

1. 树

    树是一种层次性数据结构,其中第一层只有一个结点称根节点,根据节点的分支情况,结点可分为父节点与子节点,父节点可由多个子节点,但子节点只能有一个父节点。如果每个结点至多只能有两个子结点,则为常用的二叉树,如果有多于2个结点,加以其他限制条件,则可以构造B树或B+树等。
   树是一种非常重要的数据结构,在STL中map的底层即使用红黑树实现。最常用的树即二叉查找树。关于树的各种概念也是树的各种操作的基础。


2. 满二叉树/完全二叉树

    二叉树中根节点称第1层,易知第n层至多有2^(n-1)-1个结点。如果每一层节点都达到最大节点数,则称此树为满二叉树(Full Binary Tree)。如下:


    如果前n-1层均达到最大数量,且最后一层第n层的结点都位于树的左侧,则称此树为完全二叉树(Complete Binary Tree)。具有n个结点的完全二叉树的深度为⌊log2n⌋,对于结点i其左孩子为2i+1,右孩子为2i+2。(从结点0开始)。

题目1:对于一个有800个结点的完全二叉树来说,他有多少个叶子结点?
    一个K层满二叉树共有2^K-1个结点,故对完全二叉树来讲要求:2^K-1>=800;2^(k-1)-1<=800. K=10.故第K层有800-511=289个叶子结点,而在上一层中右边仍有若干叶子结点256 -(289/2+1)= 111。故共有289+111 = 400个结点。


3.最优二叉树

    霍夫曼树又称最优二叉树,是一种带权值路径长度最小的树。信源编码中的霍夫曼编码即由此得出。如下图:

    

霍夫曼树的构建方法如下:
1. 把n个终端节点加入第一个伫列(依照权重大小排列,最小在前端)
2.如果伫列内的节点数>1,则:
    (1)从伫列前端移除两个最低权重的节点
    (2)将(1)中移除的两个节点权重相加合成一个新节点
    (3)加入第二个伫列
3. 最后在第一个伫列的节点为根节点


4.次优二叉树

    在各个查找单元等概率的情况下,利用判定树可以获得二分查找的较好结果。但是当查找概率不等时,需要构建带权值的最优二叉树。而构建最优二叉树(即霍夫曼树)的代价过大,我们可以构建次优二叉树
    首先按照关键字排序,选择权值和靠近中间的作为根节点,两边的分别作为左子树和右子树,同理,将两边继续分直到形成叶子节点。由于在构建此树时,将某点左右两边的权值和进行比较,未考虑根节点的权值,有可能导致被选为根的关键字的权值比与它相邻的关键字的权值小,此时可做适当调整,选取临近权值较大的关键字作为次优二叉树的结点。


5.二叉查找树

   二叉排序树 binary sort tree或称二叉搜寻树是一种动态树表,中序遍历即可获得一个关键字的有序序列。一个无序序列可以通过构造一棵二叉排序树而变成有序系列。通过对其限制或扩展可以进一步构造AVL树及B树。
(1) 对二叉排序树的插入,都是在二叉树上新建新的叶子结点。对于不同的插入顺序,形成的二叉排序树是不同的。
(2) 利用二叉排序树查找,最好情况下与在折半查找中所形成的判定树查找效果相同,而最坏情况下为(n+1)/2,为顺序查找相同。期望O(logn),最坏O(n);即可引入平衡树的概念。
(3) 而对其删除操作,若删除为叶子结点,则可将其直接删除,修改器双亲结点指针即可;若删除的结点仅有左子树或右子树,则直接另其双亲结点指向其左子树或右子树即可;若删除的结点左右子树均为非空,则首先找到删除结点P左子树PL的右子树中的最后一个点S(PL中的最大值),可删除P后另PL代替P,而PR连到S的右子树中图c或者将S代替P,并将SL连到原来S的位置图d。



6.平衡树

    由于二叉树的查找效率与树高有关系,所以引入平衡二叉树或称AVL树。
    平衡二叉树具有如下的性质:在平衡二叉树中,对每一个结点而言,其左子树与右子树的深度之差绝对值都小于1。
    可以将二叉排序树构建成为平衡树,只是构建及删除过程中均需要调整两侧树高,以满足平衡条件。在平衡二叉树的表示中,需要添加一个新的表示值 平衡因子,表明当前点的左右深度之差,如左子树插入一个结点后,该值变增加1,如果大于1时便需要进行相应的调整(对子树进行旋转)。在平衡树上查找的时间复杂度为O(logn)。
    AVL树以一种自平衡的二叉查找树。


7.B树与B+树

    见:http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html
    B树概括起来说是一个节点可以拥有多于2个子节点的多路平衡查找树。其存储排序数据并允许以O(log n)的运行时间进行查找,顺序读取,插入和删除的数据结构。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在数据库和文件系统。
一棵m阶的B-树或为空树或者满足:1.树中每个结点至多有m棵子树;2.若根节点不是叶子节点,则至少有两棵树;3.除根节点以外的其他非终端结点至少有sup(m/2)棵子树,至多有m-1个;
    B-树的生成是从空树起逐渐插入关键词而得。但由于B-树结点中的关键字的个数必须≥sup[m/2]-1根据其第三条性质;故而每次插入时,首先在最底层的某个非终端结点中添加一个关键字,如果关键字个数不超过m-1(第一条性质),则插入完成,否则需要进行结点“分裂”,将多余结点逐层上移,直到满足条件。
反之,当在B-树中删除一个结点时首先应当找到该关键点的所在结点,并在其中删除之,若该节点为最下层的费终端结点,且其中的关键字数目不少于sup(m/2)则删除完成,否则就要进行“合并”结点的操作。
    B+ 树是一种树数据结构,通常用于数据库和操作系统的文件系统中。B+树与B-树相比,在B+树中所有的叶子节点包含了所有关键字的信息,所有的非终端信息可以看成索引部分,结点中仅含有其子树的最大或最小的关键字。B+树的随机查找插入删除均与B-树类似,对于插入而言,若非终端节点等于给定值,并不终止,而是直到叶子结点,每次查找都会走一条从根到叶子节点的路径;其插入仅在叶子结点进行,当结点关键字个数超过m-1时将其分裂;删除也仅在叶子节点进行,当叶子结点中的最大关键字被删除时,其在费终端结点中的值可以作为一个分界关键字存在。
例B树:关键字集合分布在整颗树中;任何一个关键字出现且只出现在一个结点中;搜索有可能在非叶子结点结束;其搜索性能等价于在关键字全集内做一次二分查找;自动层次控制;
    
    例B+树,非叶子结点的子树指针与关键字个数相同;非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);为所有叶子结点增加一个链指针;所有关键字都在叶子结点出现;


8.红黑树

    红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组(STL中的set与map底层均使用红黑树)。
    红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。并添加一系列的约束条件,从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。
    因为每一个红黑树也是一个特化的二叉查找树,因此红黑树上的只读操作与普通二叉查找树上的只读操作相同。然而,在红黑树上进行插入操作和删除操作会导致不再符合红黑树的性质。恢复红黑树的属性需要少量(O(log n))的颜色变更(实际是非常快速的)和不超过三次树旋转(对于插入操作是两次)。虽然插入和删除很复杂,但操作时间仍可以保持为 O(log n) 次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值