分层次的非线性结构——树(二叉树的逻辑结构)02

二叉树的逻辑结构

二叉树在采用链式存储方式时是一种存储效率较高的结构,也是一种最简单的树的形式,因此重点讨论二叉树的特性、存储及运算。

问题:如何实现树与二叉树的转换?
在这里插入图片描述

1. 树转换为二叉树

转换过程:

加线:在所有相邻兄弟结点之间加一条连线。
去线:对每个非终端结点,除了其最左孩子以外,删去该结点与其他孩子结点的连线。
旋转:以根结点为轴心,向右旋转 45°。
调整:整理成二叉树。
在这里插入图片描述

树转换为二叉树的过程中各结点的联系有怎样的变化?

讨论:加线的过程,是增加了结点和兄弟的直接关联;
去线的操作,是去掉了除长子之外的联系,但是可以通过长子的兄弟关系,间接得到所有孩子的信息,这个和前面介绍的“树链式存储-孩子兄弟表示法”是一样的原理。

2.森林转换为二叉树

转化:分别将森林中的每棵树转化为二叉树。
连接:从最后那棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,直到所有二叉树都连接,然后整理成二叉树。
在这里插入图片描述

3.二叉树还原为树

加线:若某结点 x 是其双亲 y 的左孩子,则把结点 x 的右子孙都与结点 y 用线连起来。
去线:删去原二叉树中所有的双亲结点与右孩子结点的连线。
调整:整理由以上两步所得到的树或森林,使之层次分明。
在这里插入图片描述
树还原为二叉树的过程中各结点的联系有怎样的变化?

一个结点x的左孩子其子孙,从来历上看,都是这个左孩子的兄弟,如图5.24中的FG点,都是E的子孙,EFG都是B的孩子,故加线是恢复结点与孩子的关系;去线是去掉兄弟间的连线,这样就可以恢复成原来的树结构了。

4.树与二叉树的存储关系

一棵树采用孩子兄弟表示法所建立的存储结构,与它所对应的二叉树的二叉链表存储结构是完全相同的,只是两个指针域的名称及解释不同而已,图(c)中,结点 C 是结点 B 的右兄弟,而图(e)中,结点 C 是结点 B 的右孩子。因此,二叉链表的有关处理算法可以很方便地转换为树的孩子兄弟链表的处理算法。
在这里插入图片描述

二叉树的概念

1.二叉树的定义

二叉树是n(n≥0)个结点的有限集,它或为空树(n=0),或由一个根结点和两棵分别称为左子树和右子树的互不相交的二叉树构成。

说明:二叉树是每个结点最多有两个子树的有序树。二叉树的子树通常称为“左子树”(left subtree)和“右子树”(right subtree)。左、右子树的顺序不能互换。

二叉树与树的区别是什么?

讨论:尽管二叉树与树有许多相似之处,树和二叉树的两个主要差别:
(1)树中结点的最大度数没有限制,而二叉树结点的最大度数为2;
(2)树的结点无左、右之分,而二叉树的结点有左、右之分,
在这里插入图片描述
2.二叉树的各种形态

五种基本形态
在这里插入图片描述

二叉树的特殊形态—— 满二叉树(Full Binary Tree)
在这里插入图片描述

二叉树的特殊形态——完全二叉树
在这里插入图片描述

完全二叉树的描述:先给满树编号,根结点编号为1,从根开始自顶向下,自左至右,结点连续编号,在去掉若干结点后,如果树的编号依然连续,则是完全二叉树。
在这里插入图片描述

二叉树的基本性质

在这里插入图片描述
证:n0=n2+1

设二叉树上结点总数:n=n0+n1+n2
又二叉树上分支总数:b=n1+2*n2
而 b=n-1=n0+n1+n2-1(减去上面没有连线的结点)
因此,n0=n2+1
在这里插入图片描述
【例1】二叉树各种结点数目的计算

若一个完全二叉树有n=1450个结点,则度为1的结点、度为2的结点、叶子结点个数分别是多少?有多少左孩子,多少右孩子?该树的高度是多少?

解:树的高度 h =[log n]+1=11

树的高度:∵ 是完全二叉树 ∴ 1~10层全满,k=10

最下层叶子结点的个数=n-(2^k -1)=1450-1023=427

k-1层带叶子的结点数=[(427+1)/2]=214

k-1层结点数=2^(k-1)=512

k-1层叶子数=512-214=298

∴ 总叶子数n0=427+298=725

度为2的结点n2= n0-1=724

度为1的结点n1= n-1 - 2n2=1450-1-2*724=1

有左孩子结点数=度为2的结点数+度为1的结点数=725

有右孩子结点数=度为2的结点数= 724

.
.

二叉树的操作定义

在这里插入图片描述

发布了26 篇原创文章 · 获赞 3 · 访问量 1471

猜你喜欢

转载自blog.csdn.net/herui7322/article/details/104169201