文章目录
参考文献: python实现二叉树
一,树和二叉树的定义
1,树型结构
2,树的定义
3,树的表达方式
其中蓝色的为最常用的表达方式
二,树的基本术语
1,树
根节点:没有双亲(前驱),有孩子(后继)
叶子结点:有双亲,没有孩子
树的深度:节点的最大层次(下图的深度为 4),也称为树的高度
也可以说 B 是 T1 的根节点,它的度为 2
F 叶子(终端节点)
B,C,D,E,H为内部节点
节点的子树根称为该点的孩子,该点称为孩子的双亲
eg:在子树 T1 中,就可以说 E 是 K,L的双亲,则 K,L 就是 E 的孩子
节点的祖先:从根节点到该节点所经分支上的所有节点。
eg:M 的祖先,有 A,D,H
eg:T1,T2,T3 是有固定顺序的,则称为有序树
2,森林
将 A 去掉,我们就形成了一个,由 T123 三棵树组成的三林
不去掉 A ,则为一个只有一棵树的特殊森林
3,树形结构与线性结构的比较
三,二叉树
1,为什么使用二叉树
2,二叉树的定义
什么是二叉树,它的特点又是什么 ↓
二叉树不是树的特殊情况
举个例子更明显的看一下他们两个的区别
3,二叉树的5种形态
所有的二叉树都出自于以下五种形态。
虽然二叉树与树的概念不同,但有关树的基本属于对二叉树都适用!
4,案例引入
案例1:数据压缩问题
案例2:利用二叉树求解表达式
(最后通过 递归运算 进行求解)
5,二叉树的性质与存储结构
性质 1
补充:第 i 层上,至少有一个节点,否则该层不存在
性质 2
补充:深度为 k 的二叉树,最少有 k 个节点
性质 3
通过 边数B 来证明
两种特殊形式的二叉树
满二叉树
满二叉树,在同样深度的二叉树中节点和叶子节点的个数是最多的。
完全二叉树
(最后一个中的 F,虽然是6号,但是在7号位置上,不是一一对应的)
视频素材 - 性质4,5
性质4
性质5(手动星标)
存储结构
二叉树的顺序存储
二叉树的链式存储结构
6,遍历二叉树(手动星标)
遍历定义 — 顺着某一条搜索路径巡访二叉树的节点,使得每一个节点均被访问一次(又称周游)。
其中“访问”可以使对节点进行各种处理,如:输出信息,修改节点的数据值等,但不可以破坏原有的数据结构。
遍历目的 — 得到树中所有节点的一个线性排列。
遍历用途 — 他是树结构插入、修改、删除、查找和排序运算的前提,是二叉树一切运算的基础和核心。
遍历方法
依次遍历二叉树中的三个组成部分,便是遍历整个二叉树(子树也是一个二叉树)
假设:
- L:遍历左子树
- D:访问根节点
- R:遍历右子树
则遍历整个二叉树的方案由(3!个):
DLR, LDR, LRD, DRL, RDL, RLD 六种
若规定先左后右,则只有三种情况:
- DLR ---- 先(根)序遍历
- LDR ---- 中(根)序遍历
- LRD ---- 后(根)序遍历
先序遍历二叉树 - 前缀表式(波兰式)
- 若二叉树为空,则空操作;
- 否则
(1)访问根节点
(2)先序遍历左子树
(3)先序遍历右子树
中序遍历二叉树 - 中缀表式
- 若二叉树为空,则空操作;
- 否则
(1)中序遍历左子树
(2)访问根节点
(3)中序遍历右子树
后序遍历二叉树 - 后缀表式(逆波兰式)
- 若二叉树为空,则空操作;
- 否则
(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根节点
由二叉树的递归定义可知,遍历左子树和遍历右子树如同遍历二叉树一样“递归”进行。
举个“栗子”:
看不懂的话 戳我!
先序遍历的顺序为:
A - B - E - L - D - H - M - I - J
中序遍历的顺序为:
E - L - B - A - M - H - I - D - J
后序遍历的顺序为:
L - E - B - M - I - H - J - D - A
练习一下吧(一定要先自己写!)
先序:A - B - D - G - C - E - H - F
中序:D - G - B - A - E - H - C - F
后序:G - D - B - H - E - F - C - A
例题 ---- 用二叉树表示算术表达式
(前缀表示)先序:- + a * b - c d / e f
(中缀表示)中序:a + b * c - d - e / f
(后缀表示)后序:a b c d - * + e f / -
(你算对了吗~嘎嘎)
由遍历结果得出二叉树
看不懂的话 戳我!
性质:
- 若二叉树中个结点的值均不同,则二叉树结点的先序序列,中序序列和后序序列都是唯一的。
- 由二叉树的先序序列和中序序列,或由二叉树的后序序列和中序序列可以确定唯一一棵二叉树。
已知先序和中序序列求二叉树
例: 先(根左右);中(左根右)
先序:A - B - C - D - E - F - G - H - I - J
中序:C - D - B - F - E - A - I - H - G - J
分析:先序确定根,中序确定左右子树
(最后可以反推进行验证)
已知中序和后序序列求二叉树
例:中(左根右);后(左右根)
中序:B - D - C - E - A - F - H - G
后序:D - E - C - B - H - G - A - F
分析:由后序确定根,中序确定左右子树
(不会的话一定要回头看懂再继续往下看!!!)