数据结构笔记——树与二叉树

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

好好学习,天天向上

本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star

⭐⭐⭐⭐⭐转载请注明出处:https://blog.csdn.net/weixin_43461520/article/details/124003408

5.1 树的基本概念

5.1.1 树的定义

树是n个节点的有限集。n=0时,称为空树。任何一个非空树应该满足:

  • 有且仅有一个根结点
  • 当n > 1时,其余结点可分为m(m > 0)个互不相交的有限集合T1, T2, … , Tm,其中每个集合本身又是一棵树,并且称为根结点的子树

5.1.2 树的概念

  • 双亲结点(父节点):结点上面一层用线连起来的节点。比如结点G的父节点是C。
  • 孩子结点:结点下面一层用线连起来的结点,比如结点D的孩子结点为H、I、J。
  • 叶子节点:结点的度为0的结点,也就是没有孩子结点的结点,图中叶子节点为K、L、F、G、M、I、J。
  • 结点的层次:从上往下数在第几行,比如根节点在第1层,结点E在第3层。
  • 结点的高度:从下往上数。
  • 结点的深度:从上往下数。
  • 树的高度(深度):总共多少层,图中的数高度为4。
  • 结点的度:有几个孩子节点,比如图中结点H的度为0。
  • 树的度:树中结点的最大度数,图中结点D的度最大,为3,所以树的度也为3。
  • 路径:一个结点到另一个结点的路线,只能是从上往下,比如A→K的路径为A→B→E→K。
  • 路径长度:路径上所经过的边的个数,比如A→K路径长度为3。
  • 有序树和无序树:树中结点的各子树从左到右是有次序的,不能互换,称为有序树。反之称为无序树。

5.1.3 树的性质

  1. 结点数 = 总度数+1

结点的度为结点有几个孩子结点,由于没有哪一个结点的子节点是根结点,所以总度数不包含根结点。所以结点数为总度数+1。

上图中A的度为3,B的度为2,C的度为1…总度数为3+2+1+3+2+1=12。

结点数为13=12+1。
2. 度为m的树、m叉树 的区别

度为m的树 m叉树
各结点的度的最大值 每个结点最多只能有m个孩子的树
任意结点的度 ≤ m(最多m个孩子) 任意结点的度 ≤ m(最多m个孩子)
至少有一个结点度 = m(有m个孩子) 允许所有结点的度都 < m
一定是非空树,至少有m+1个结点 可以是空树


3. 度为 m 的树第 i 层至多有 m^(i-1) 个结点(i≥1),m叉树第 i 层至多有 m^(i-1) 个结点(i≥1)


4. 高度为h的m叉树至多有 (m^h -1)/(m-1) 个结点


5. 高度为h的m叉树至少有 h 个结点;高度为h、度为m的树至少有 h+m-1 个结点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gwWgXiwD-1649265257077)(https://gitee.com/RobodLee/image_store/raw/master/%E7%AE%97%E6%B3%95%E5%92%8C%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AC%94%E8%AE%B0%E6%A0%91%E4%B8%8E%E4%BA%8C%E5%8F%89%E6%A0%91/image_p3id69ktvvDpPMtopyQfCr.png)]
6. 具有n个结点的m叉树的最小高度为logm(n(m - 1) + 1)

5.2二叉树的概念

5.2.1 基本概念

二叉树是n(n≥0)个结点的有限集合:

  • 或者为空二叉树,即n = 0。
  • 或者由一个根结点和两个互不相交的被称为根的左子树右子树组成。左子树和右子树又分别是一棵二叉树
  • 每个结点至多只有两棵子树。
  • 左右子树不能颠倒(二叉树是有序树

5.2.2 几个特殊的二叉树

  • 满二叉树:一棵高度为h,且含有2^h - 1个结点的二叉树

    • 只有最后一层有叶子结点
    • 不存在度为 1 的结点
    • 按层序从 1 开始编号,结点 i 的左孩子为 2i,右孩子为 2i+1;结点 i 的父节点为i/2(如果有的话)
  • 完全二叉树:当且仅当其每个结点都与高度为h的满二叉树中编号为1~n的结点一一对应时,称为完全二叉树

    • 只有最后两层可能有叶子结点
    • 最多只有一个度为1的结点
    • 按层序从 1 开始编号,结点 i 的左孩子为 2i,右孩子为 2i+1;结点 i 的父节点为i/2(如果有的话)
    • i≤ (n/2) 为分支结点, i> (n/2) 为叶子结点
    • 如果某结点只有一个孩子,那么一定是左孩子
  • 二叉排序树(可用于元素的排序和搜索):一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树

    • 左子树上所有结点的关键字小于根结点的关键字
    • 右子树上所有结点的关键字大于根结点的关键字
    • 左子树和右子树又各是一棵二叉排序树[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w8k73Szt-1649265257082)(https://gitee.com/RobodLee/image_store/raw/master/%E7%AE%97%E6%B3%95%E5%92%8C%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AC%94%E8%AE%B0%E6%A0%91%E4%B8%8E%E4%BA%8C%E5%8F%89%E6%A0%91/image_fBs6fpeRE7mkRx4fayuD1b.png)]
  • 平衡二叉树(搜索效率高):树上任一结点的左子树和右子树的深度之差不超过1。

5.2.3 性质

二叉树的性质
  1. 设非空二叉树中度为0、1和2的结点个数分别为n0、n1和n2,则 n0 = n2 + 1(即叶子结点比二分支结点多一个)


2. 二叉树第 i 层至多有 2^(i-1) 个结点(i≥1),m叉树第 i 层至多有 m^(i-1) 个结点(i≥1)


3. 高度为h的二叉树至多有 2^ℎ − 1个结点(满二叉树),高度为h的m叉树至多有 (m^h -1)/(m-1) 个结点

完全二叉树的性质
  1. 具有n个(n > 0)结点的完全二叉树的高度h为 ⌈log₂(n + 1)⌉ 或 ⌊log₂n⌋+1


2. 对于完全二叉树,可以由结点数 n 推出度为0、1和2的结点个数为n0、n1和n2

5.2.4 二叉树的存储结构

顺序存储
struct TreeNode {
    ElemType value; //结点中的数据元素
    bool isEmpty;   //结点是否为空
};

链式存储
typedef struct BiTNode {
    ElemType data;                      //数据域
    struct BiTNode *lChild, *rChild;    //左右孩子指针
} BiTNode, *BiTree;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值