演算法 - 树


参考文献python实现二叉树

一,树和二叉树的定义

在这里插入图片描述

1,树型结构

在这里插入图片描述

2,树的定义

在这里插入图片描述

3,树的表达方式

其中蓝色的为最常用的表达方式
在这里插入图片描述

二,树的基本术语

视频素材 - bilibili

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,二叉树的性质与存储结构

视频素材 - bilibili 性质1~3

性质 1

在这里插入图片描述
补充:第 i 层上,至少有一个节点,否则该层不存在
在这里插入图片描述

性质 2

在这里插入图片描述
补充:深度为 k 的二叉树,最少有 k 个节点
在这里插入图片描述

性质 3

在这里插入图片描述
通过 边数B 来证明
在这里插入图片描述

两种特殊形式的二叉树

视频素材 - bilibili

满二叉树

在这里插入图片描述
满二叉树,在同样深度的二叉树中节点叶子节点的个数是最多的。

完全二叉树

在这里插入图片描述
(最后一个中的 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

分析:由后序确定根,中序确定左右子树
在这里插入图片描述(不会的话一定要回头看懂再继续往下看!!!)

二叉树的先序递归遍历算法

发布了17 篇原创文章 · 获赞 4 · 访问量 510

猜你喜欢

转载自blog.csdn.net/weixin_46072771/article/details/105091554