学《数据结构》越学越聪明--第七章》》》树和二叉树2

二叉树的概念

二叉树的定义

二叉树是有限的结点集合。

  • 这个集合或者是空
  • 或者由一个根节点和两颗互不相交的称为左子树和右子树的二叉树组成

在这里插入图片描述

二叉树的五种基本形态:

  1. 空树
  2. 只有根结点
  3. 左子树为空树
  4. 右子树为空树
  5. 左右子树不为空树

特殊的二叉树

满二叉树
  • 所有分支结点都有双分支结点;
  • 且叶结点都集中在二叉树的最下层。

在这里插入图片描述

完全二叉树
  • 最多只有下面两层的结点的度数小于2
  • 且最下面一层的结点依次排列在最左侧的位置上

完全二叉树实际上是对应的满二叉树删除叶节点层最右边若干个节点得到的。

在这里插入图片描述

二叉树的性质

性质1

非空二叉树上叶节点数等于双分支节点数+1。即n0=n2+1.

度之和=分支数

度之和=n1+2n2

分支数=n-1

n=n0+n1+n2

由此得出 n0+n1+n2=n1+2n2 =====>n0=n2+1

在这里插入图片描述

求解二叉树的节点个数问题:通常利用二叉树的性质1

在这里插入图片描述

性质2

非空二叉树上第i层上至多有2的i-1次方个节点(i>=1)

在这里插入图片描述

性质3

高度为h的二叉树至多有2的h-1次方个节点(h>=1)

在这里插入图片描述

性质4

完全二叉树性质(含n为节点):

  1. n1=0或者n1=1。n1可由n的奇偶性确定:

    n为奇数=>n1=0; n为偶数=>n1=1

  2. 若i≤⌊n/2⌋,则编号为i的节点为分支节点,否则为叶节点

  3. 除数根节点外,若一个节点的编号为i,则它的双亲结点为⌊i/2⌋

  4. 若编号为i的节点有左孩子节点,则左孩子节点的编号为2i;若编号为i的节点有右孩子节点,则右孩子节点的编号为2i+1

在这里插入图片描述
在这里插入图片描述

二叉树与树、森林之间的转换

森林、树转换为二叉树

一颗树转换成二叉树

在这里插入图片描述

首先,我们把所有的兄弟用虚线链接,然后只保留最左边的孩子或唯一一个孩子以外,把剩下的双亲连线删除掉,然后顺时针方向选择45度

在这里插入图片描述

多棵树转换为二叉树

在这里插入图片描述

首先把每一棵树都转换成二叉树,然后把他们组合到一起,把第二棵树的根节点作为第一棵树根节点的右孩子,第三棵树的根节点作为第二棵树的根节点的右孩子

在这里插入图片描述

二叉树还原为森林、树

在这里插入图片描述

考察每一个节点的右分支节点,把每一个右分支节点和他的双亲用虚线链接起来,然后删除掉右分支线,再把它逆时针方向旋转45度

在这里插入图片描述

将一颗二叉树还原成多颗树

在这里插入图片描述

首先我们考察这棵二叉树,我们把根节点的右下节点每个节点对应的那颗树提取出来,也就是说把这一颗二叉树转换为三颗二叉树。

在这里插入图片描述

再把这三棵二叉树转化为对应的二叉树

在这里插入图片描述

设计一棵二叉树,表示夫妻、父子和兄弟3种关系

在这里插入图片描述

二叉树的存储结构

完全二叉树的顺序存储结构

在这里插入图片描述

非完全二叉树的顺序存储结构

一般的二叉树先用空节点补全成为完全二叉树,然后对节点编号

在这里插入图片描述

二叉树的顺序存储结构的特点
  • 对于完全二叉树来说,其顺序存储是十分合适的。
  • 对于一般的二叉树,特别是对于那些单分支节点较多的二叉树来说是很不合适的,因为可能只有少数存储单元被利用,特别是对退化的二叉树(即每个分支节点都是单分支的),空间浪费更是惊人。
  • 在顺序存储结构中,找一个节点的双亲和孩子都很容易。

在这里插入图片描述

二叉树的链式存储结构

借鉴树的孩子链存储结构=》二叉树的链式存储结构

在二叉树的链式存储中,节点的类型定义如下:

typedef struct node
{
ElemType data;
struct node *lchild,*rchild;  //左右指针分别指向左右两个孩子
}BTNode;

在这里插入图片描述

在这里插入图片描述

二叉链存储结构
  • 除了指针外,二叉链比较节省存储空间。占用的存储空间与树形没有关系,只与树中结点个数有关。
  • 在二叉链中,找一个结点的孩子很容易,但找其双亲不方便。

在这里插入图片描述

在二叉链中,空指针的个数?

  • n个节点=》2n个指针域
  • 分支数为n-1=》非空指针域有n-1个
  • 空指针域个数=2n-(n-1)=n+1

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
家谱管理系统,主要用来管理家族成员的基本信息 1、确定整个程序的功能模块。实现程序的主界面,要对主界面的功能选择输入进行容错处理。 2、实现单个结点信息的录入。 3、对录入日期信息进行合法性检验。 4、采用改变字体颜色的方式突出显示主界面的功能项。 5、计算从出生日期到死亡日期的实际天数 6、若家谱为空,则新建家谱。实现成员节点的添加。基本功能中可以 强制要求所有成员不同名,即不考虑同名情况(符合小家族的实际情况)。 7、添加成员节点时,可以选择将新添加的节点作为整个家谱的上一代祖先, 或者将新添加的节点作为某个现有成员的孩子。 8、作为某个现有成员的孩子,根据给出的父节点的姓名将该结点添加到相 应位置,注意,针对某一父节点,添加第一个孩子和其它孩子的区别。 9、要求在孩子兄弟二叉树中按各个孩子的年龄进行排序。 10、将家谱保存到二进制文件。注意,不能保存空白节点。 11、从文件读入家谱信息,重建孩子兄弟二叉树形式的家谱。 12.从文件中读出所有节点信息到一个数组中,然后按一年中生日的先后进 行快速排序。 13、按姓名查询家谱成员并显示该成员的各项信息。 14、给出某一成员的姓名,删除该成员和该成员的所有子孙。 15、成员信息的修改。信息修改时要给出选择界面让用户选择需要修改的信 息项。基本功能中可以限定不容许修改父亲姓名和本人姓名。对日期信 息进行修改时要进行检验。 16、实现层次递进的方式显示整个家谱,显示结果应该体现家谱的结构。 17、按各种关键字进行查询,要求给出关键字选择界面,并显示符合查询条 件的节点信息。 18、信息统计基本要求包括:平均身高,平均寿命,男女成员各多少,平均 家庭人口数目(假定每个成员构成一个家庭,该家庭的家庭成员是指成 员本人和他的孩子,即家庭人口数=孩子数+1)。要给出统计项的选择界 面. 19、查询某一成员的所有直系亲属。 20、给出某一成员的所有嫡系祖先。 21、确定两人关系。若两人辈分不等,则应指出甲是乙的多少代长辈(晚辈), 甲是否是乙的直系长辈(晚辈),若辈分相同,则应指出是亲兄弟还是多 少代的堂兄弟。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雷军的小宝贝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值