【数据结构】树 二叉树 满二叉树 完全二叉树初步理解

树的相关基本术语

在这里插入图片描述

节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6


叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点


非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G…等节点为分支节点


双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点


孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点


树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6


节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;


树的高度或深度:树中节点的最大层次; 如上图:树的高度为4


堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点


节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先


子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙


森林:由m(m>0)棵互不相交的树的集合称为森林;


树的表示形式

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,要保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法。。。树的表示形式有很多种,但是如何表示合理呢?这里我介绍一种最为合理的树的表示形式左孩子右兄弟法;

左孩子右兄弟法:顾名思义就是一个树的结构:包含左孩子指针,和右兄弟指针,加上一个值域值

注意哦
这里的左孩子指针指向的是父节点的第一个孩子指针,其他的孩子都较为兄弟了!
左孩子:相对于父节点的叫法;
右兄弟:相对于左孩子的叫法;

typedef int DataType;
struct Node
{
 struct Node* _firstChild1; // 第一个孩子结点
 struct Node* _pNextBrother; // 指向其下一个兄弟结点
 DataType _data; // 结点中的数据域
};

如图:
在这里插入图片描述
画的好看的画:
在这里插入图片描述
这个左孩子有兄弟很好的表示了树的结构


树结构典型应用场景

我们的文件系统就是啦!
无论是windows的文件系统,还是Linux的文件系统都有应用到树的结构!
在这里插入图片描述


二叉树基本概念

每个结点的度,最大为2的树就是二叉树,那么也就是说,二叉树可以度为1,度为0,都是二叉树。
二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树;
在这里插入图片描述
◼ 对于任何一棵非空二叉树,如果叶子节点个数为 n0,度为 2 的节点个数为 n2,则有: n0 = n2 + 1
证明
假设度为 1 的节点个数为 n1,那么二叉树的节点总数 n = n0 + n1 + n2
二叉树的边数 T = n1 + 2 * n2 = n – 1 = n0 + n1 + n2 – 1
因此 n0 = n2 + 1
也就是:二叉树的度为0的结点永远比度为2的结点多1个


满二叉树概念及其性质

最后一层的结点度为0,其他结点度为2
在这里插入图片描述


基本性质:
满二叉树的结点个数为 2h-1 ,其中h表示树的高度;
满二叉树从数学角度来说,就是一个等比数列:20+21+…+2h-1 = 2h-1;
很自然的第 i 层有2i-1个结点;


完全二叉树的概念和性质

叶子节点只会出现最后 2 层,最后 1 层的叶子结点都靠左对齐
完全二叉树从根结点至倒数第 2 层是一棵满二叉树
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树
在这里插入图片描述


性质:
度为1的结点一定是左子树;
度要么为1,要么为0
对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号: 那么就会有:(对于编程的写法,这个规律是成立的)

左孩子结点的下标:2*parent +1;
右孩子结点的下标:2*parent +2;
父亲结点的下标:(child -1) / 2; 其中child为左右孩子都行。


画个图就出来的性质!


一道完全二叉树的面试题

如果一棵完全二叉树有 768 个节点,求叶子节点的个数?


假设叶子节点个数为 n0,度为 1 的节点个数为 n1,度为 2 的节点个数为 n2
总结点个数 n = n0 + n1 + n2,而且 n0 = n2 + 1
✓ 得到 n = 2n0 + n1 – 1
完全二叉树的 n1 要么为 0,要么为 1
✓ n1为1时,n = 2n0,n 必然是偶数
➢ 叶子节点个数 n0 = n / 2,非叶子节点个数 n1 + n2 = n / 2
✓ n1为0时,n = 2n0 – 1,n 必然是奇数
➢ 叶子节点个数 n0 = (n + 1) / 2,非叶子节点个数 n1 + n2 = (n – 1) / 2
叶子节点个数 n0 = floor( (n + 1) / 2 ) = ceiling( n / 2 )
非叶子节点个数 n1 + n2 = floor( n / 2 ) = ceiling( (n – 1) / 2 )
因此叶子节点个数为 384


  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

呋喃吖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值