树——树、二叉树、哈夫曼树的性质
>树
树的基本术语
- 祖先:根A到结点D的唯一路径上的任意结点都可称为结点D的祖先。
- 双亲:相对于孩子在其上一级。
- 分支结点:度大于0的结点。
- 叶子结点:度等于0的结点。
- 兄弟:有相同双亲的结点。
树的存储结构
-
双亲表示法
-
孩子表示法
-
孩子兄弟表示法
- 任意一棵树都能通过孩子兄弟表示法转换为二叉树进行存储。
-
顺序存储表示法
定义
-
结点的层数从树根开始定义,根结点为第1层,它的子结点为第2层。
-
结点的深度是从根结点开始自顶向下逐层累加。
-
结点的高度是从叶结点开始自底向上逐层累加。
树的高度等于结点的最大层数
树的重要性质
-
树中的结点数等于 所有结点的度数之和 + 1
-
高度为k的m叉树最多有(m k - 1) / (m - 1)个结点
>二叉树
-
二叉树的通用公式
n0=n2+1 (n0表示度为0的结点个数、n2表示度为2的结点个数)
n总=n0+n1+n2=2n2+n1+1 (二叉树中n1一般为0、*除了完全二叉树)
-
满二叉树
-
一颗高度为h,且含有2h-1个结点的二叉树称为满二叉树,即树中的每层都含有最多的结点。
-
对满二叉树按层序编号:约定编号从根结点起,自上而下,自左而右。
- 这样,每个结点对应一个编号,对于编号为i的结点,若有双亲,则其双亲为i/2,若有左孩子,则左孩子为2i;若有右孩子,则右孩子为2i+1。
-
满m叉树第k层的结点数为mk-1
-
-
完全二叉树
-
一颗高度为h,且含有n个结点,每个结点编号与满二叉树中的编号一一对应称为完全二叉树。
-
叶子结点只可能在层次最大的两层上出现。对于最大层次中的叶子结点,都依次排列在该层最左边的位置上。
-
若有度为1的结点,则只可能有一个,且该结点只有 左孩子 而无右孩子。
-
按层序编号后,一旦出现结点i为叶子结点或只有左孩子,则编号大于i的结点均为叶子结点。
-
若n为奇数,则每个分支结点都有左孩子和右孩子;
-
若n为偶数,则编号最大的分支结点只有 左孩子 ,没有右孩子。
-
其余分支结点左右孩子都有。
-
-
叶子结点个数等于总结点数/2(四舍五入);
-
-
二叉树的存储结构
-
顺序存储结构
-
链式存储结构
-
-
二叉树的遍历
-
先序遍历(MLR)
-
中序遍历(LMR)
-
后序遍历(LRM)
-
-
树转换成二叉树
口诀:左孩子,右兄弟。
>哈夫曼树
-
WPL(带权路径长度)
树中所有叶子结点的带权路径长度之和。
(路径长度根结点从0开始向下累加)
-
哈夫曼树的构造
WPL=5 x 2 + 2 x 3 + 4 x 3 + 7 x 2 + 9 x 2 = 60
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构