【数据结构与算法】树和二叉树

1 树

1.1 术语

  • 关系术语

    孩子结点 —— 子树的根
    父结点
    兄弟结点 —— 同一个结点的孩子结点互为兄弟
    祖先结点
    后代结点

  • 层次类术语

    根的层次为1
    其余结点的层次为其父结点层次加1
    高度/深度 —— 整个树中结点的最大层次
    度 —— 结点的孩子数目称为结点的度
    叶子(终结点)—— 度为0
    分支结点 —— 度不为0的结点(非叶子结点)
    树的度 —— 最大的结点度
    森林 —— 多棵树
    有序树/无序树 —— 按照兄弟结点之间的排列是否有序

1.2 表示法

二叉链表表示法,或二叉树表示法

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

1.3 结点数目

已知一棵树的度为4,其中度为4的结点的数目为3,度为3的结点的数目为4,度为2的结点的数目为5,度为1的结点的数目为2,请求出该树中的叶子结点的数目。

设叶子的节点数为 n 0 n_0 n0,度为1的节点数为 n 1 n_1 n1,度为2的节点数为 n 2 n_2 n2,度为3的节点数为 n 3 n_3 n3,度为4的节点数为 n 4 n_4 n4,总节点数为 n n n,则可得到
n = n 0 + n 1 + n 2 + n 3 + n 4 (1) n=n_0+n_1+n_2+n_3+n_4\tag{1} n=n0+n1+n2+n3+n4(1)
设树的总入度为 m m m。由于在树中除了根结点外,其余每一个结点都有唯一的一个分支进入,则树的总结点数为
n = m + 1 (2) n=m+1\tag{2} n=m+1(2)
又由于树中这m个进入分支分别由非叶子结点射出,其中度为1的结点射出1,度为2的结点射出 2,依此类推。而且射出分支总数与总的进入分支数相等,即
m = n 1 + 2 n 2 + 3 n 3 + 4 n 4 (3) m=n_1+2n_2+3n_3+4n_4\tag{3} m=n1+2n2+3n3+4n4(3)
由式(1)、(2)、(3)可以得到
n 0 = n 2 + 2 n 3 + 3 n 4 + 1 = 5 + 2 × 4 + 3 × 3 + 1 = 23 n_0=n_2+2n_3+3n_4+1=5+2\times 4+3\times3+1=23 n0=n2+2n3+3n4+1=5+2×4+3×3+1=23

2 二叉树

  • 二叉树与树的区别

    是两种不同性质的结构
    二叉树存在空树
    二叉树恰有两个子树,树可有多个
    二叉树子树有序,树无序

  • 二叉树的五种形态

    (1)空树,即结点数为0
    (2)单结点二叉树,即仅有一个结点
    (3)左子树为空右子树不空
    (4)右子树为空左子树不空
    (5)左右子树均不空

2.1 二叉树

2.1.1 二叉树性质

  1. 第i层节点数 ≤ 2 i − 1 \le 2^{i-1} 2i1
  2. 高度为 k ( k ≥ 1 ) k (k\ge 1) k(k1)的二叉树的结点总数 ≤ 2 k − 1 \le 2^k-1 2k1
  3. 设二叉树的叶子结点数为 n 0 n_0 n0,度为2的结点数为 n 2 n_2 n2,则 n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1

已知一棵二叉树中,有20个叶子结点,10个结点只有左孩子,15个结点只有右孩子,求该二叉树的总结点数。

n 0 = 20 , n 2 = n 0 − 1 = 20 − 1 = 19 n_0=20, n_2=n_0-1=20-1=19 n0=20,n2=n01=201=19
n 1 = n l + n r = 10 + 15 = 25 n_1=n_l+n_r=10+15=25 n1=nl+nr=10+15=25
n = n 0 + n 1 + n 2 = 20 + 25 + 19 = 64 n=n_0+n_1+n_2=20+25+19=64 n=n0+n1+n2=20+25+19=64

2.1.2 二叉树遍历

已知一棵二叉树的先序序列和中序序列,要求还原该二叉树。
先序:ABCDEFG
中序:CDBEAGF
关键在于找根
已知中序序列和后序序列,或中序序列和先序序列,可以唯一确定一棵二叉树
而已知先序序列和后序序列不能唯一确定二叉树

在这里插入图片描述

先序和后序相同

空树或者只有根节点的二叉树。

先序和后序相反

(1)当且仅当二叉树中只有一个叶子节点。
(2)二叉树的高度和其节点个数相同。

先序和中序相同

空树或缺左子树的单支二叉树。

先序和中序相反

(1)二叉树为空或者只有一个节点。
(2)若二叉树不为空 则任意节点不能同时拥有左孩子和右孩子 上面那个二叉树留下FBE。
(3)若二叉树不为空 则任意节点没有右孩子。

中序和后序相同

空树或者缺右子树的单支二叉树。

中序和后序相反

任意节点没有左孩子节点。

先序序列中最后一个结点是叶子结点。TRUE
后序序列中第一个结点是叶子结点。TRUE
中序序列中第一个结点是叶子结点。FALSE

2.2 满二叉树 完全二叉树 非完全二叉树

  • 满二叉树:称高度为 k k k且有 2 k − 1 2^k-1 2k1个结点的二叉树为满二叉树

  • 完全二叉树

在满二叉树最下一层从右到左依次连续去掉若干个结点的二叉树称为完全二叉树
编号的方式:从上到下,每一层中从左到右,根节点编号为1

  1. 有n个(n≥1)结点的完全二叉树的高度为 ⌊ log ⁡ 2 n ⌋ + 1 \lfloor \log_2{n} \rfloor+1 log2n+1
  2. 对完全二叉树进行编号,则对编号为 i i i的结点,若存在左孩子结点,则其左孩子结点的编号为 2 i 2i 2i,若存在右孩子结点,则其右孩子结点的编号为 2 i + 1 2i+1 2i+1,若存在父结点,则其父结点的编号为 ⌊ i / 2 ⌋ \lfloor i/2 \rfloor i/2

求100个结点的完全二叉树的叶子结点数。

根据性质4,从编号51到100都是叶子。共有50个叶子。

已知完全二叉树的第7层有10个结点,问共有多少个结点?多少个叶子结点?多少个度为1的结点?

共有 2 6 − 1 + 10 = 73 2^6-1+10=73 261+10=73个结点。
叶子求法:
方法1、37到73都是叶子,共37个叶子结点;
方法2、第7层10个结点都是叶子,第6层有32个结点,其中5个结点是第7层10个结点的父亲,
所以共有 10 + 32 − 5 = 37 10+32-5=37 10+325=37个叶子结点。
度为1的结点数为0。

判断题:完全二叉树最多有1个度为1的结点。( True )
编号为i、j的两个结点是否在同一层的条件是 ⌊ log ⁡ 2 i ⌋ = ⌊ log ⁡ 2 j ⌋ \lfloor \log_2 i\rfloor=\lfloor \log_2 j\rfloor log2i=log2j

3 哈夫曼树

  • 定义

给定一组数值 w 1 , w 2 , . . . , w n {w_1, w_2,...,w_n} w1,w2,...,wn,作为叶子结点的权值构造一棵二叉树。
若二叉树满足 W P L = ∑ i = 1 n w i L i WPL=\sum_{i=1}^{n}w_iL_i WPL=i=1nwiLi 最小
(其中 L i L_i Li w i w_i wi对应的叶子结点到根结点的路径长度)
则称此二叉树为最优二叉树,也称哈夫曼树,并称WPL为带权路径长度。

  • 性质

任意一棵哈夫曼树的带权路径长度均等于所有分支结点权值之和。

以集合{3,4,5,6,8,10,12,18}为叶子结点的权值构造哈夫曼树,并计算其带权路径长度。

在这里插入图片描述

4 开始练习吧

  1. 画出由4个结点所构成的所有形态的树(假设是无序树)。

  2. 已知一棵树的度为4,其中度为4的结点的数目为3,度为3的结点的数目为4,度为2的结点的数目为5,度为1的结点的数目为2,请求出该树中的叶子结点的数目。

  3. 如果已知一棵二叉树有20个叶子结点,有10个结点仅有左孩子,15个结点仅有右孩子,求出该二叉树的结点数目。

  4. 已知某完全二叉树有100个结点,试用三种不同的方法求出该二叉树的叶子结点数。

  5. 如果已知完全二叉树的第6层有5个叶子,试画出所有满足这一条件的完全二叉树,并指出结点数目最多的那棵完全二叉树的叶子结点数目。

  6. 在编号的完全二叉树中,判断编号为i和j的两个结点在同一层的条件是什么?

  7. 设计算法以求解编号为i和j的两个结点的最近的公共祖先结点的编号。

  8. 分别描述满足下面条件的二叉树的特征:
    (1)先序序列和中序序列相同。
    (2)先序序列和后序序列相反。

  9. 证明:由二叉树的先序序列和中序序列能唯一确定一棵二叉树,并分别由下面的两个序列构造出相应的二叉树:
    ①先序:ABCDEFGHI 中序:ADECFBGIH
    ②先序:ABCDEFGHIJ 中序:BDECAGIJHF

  10. 证明:由二叉树的后序序列和中序序列能唯一确定一棵二叉树,并分别由下面的两个序列构造出相应的二叉树:
    ①后序:DCFEBIHGA 中序:DCBFEAGHI
    ②后序:DECBGIHFA 中序:DCEBAFHGI

  11. 设计算法以实现将以二叉链表形式存储的树(森林)转换为对应的双亲表示形式。

  12. 已知树(森林)的高度为4,所对应的二叉树的先序序列为ABCDE,请构造出所有满足这一条件的树或森林。

  13. 设计算法将一个以孩子链表形式表示的森林转换为二叉链表形式。

  14. 设计算法按先序次序输出森林中每个结点的值及其对应的层次数。

  15. 设计算法以求解森林的高度。

  16. 设计算法以输出森林中的所有叶子结点的值。

  17. 设计算法逐层输出森林中的所有结点的值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

维他命C++

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

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

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

打赏作者

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

抵扣说明:

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

余额充值