浙大数据结构与算法慕课随手记:第三讲 树(上)

3.1 树与树的表示

分层次组织管理效率更高
数据管理基本操作:查找
静态查找:数组
方法1:顺序查找(哨兵值)O(n)
方法2:二分查找(有序+连续存储,left right mid,一般是向下取整)O(logn)
*二分查找的启示:判定树
1.每个结点的查找次数=该结点所在层数
2.查找次数≤判定树的深度
3.n个结点判定树的深度=[log2n]+1
4.ASL平均成功查找次数=总次数/总元素数
动态查找:有插入删除,查找树

树的定义:n个结点构成的有限集合,递归
n=0空树,n>0非空树
根结点Root+互不相交的子树SubTree
除Root外,每个结点有且仅有一个父结点
N个结点的树有N-1条边(最小连通方式)

树的术语
结点的度Degree(结点的子树个数)、树的度(所有结点最大的度数)
叶结点(度=0)、父结点、子结点、兄弟结点(同一父结点)
路径和路径长度(边的个数)、祖先结点、子孙结点
结点层次Level(根结点在1层,后续+1)、树的深度/高度Depth(最大层次)

树的表示
儿子-兄弟表示法(结构统一的链表)
在这里插入图片描述
旋转45度得到二叉树(度=2)Left Right(最重要的树结构)

3.2 二叉树及存储结构

定义
二叉树T:一个有穷的结点集合;若不为空,由根结点、左子树、右子树组成
相当于度=2的树,但有左右之分
五种基本形态;特殊形态:斜二叉树(≈链表)、完美/满二叉树、完全二叉树(满二叉树的叶结点可以从右向左空缺,使编号连续)

性质
(1)第i层的最大结点数=2^(i-1)
(2)深度=k,最大结点总数=2^k-1
(3)对非空二叉树,叶结点数N0=度为2非叶结点数N2+1(可用向下/上的边数证明)

操作
判别是否空、创建、遍历

存储结构

  • 顺序存储:完全二叉树(上下-左右),数组下标
    非根结点i的父结点=[i/2]
    结点i的左右子结点=2i、2i+1(≤n)
  • 链表存储:一般二叉树(节省空间)
    Left-Data-Right

3.3 二叉树的遍历

1.先序、中序、后序(序=根的顺序,递归遍历左右子树)
遍历过程中经过结点的路线一样,只是访问各结点的时机不同
每个结点有三次访问时机-先中后

2.中序非递归遍历(堆栈实现)
结点压栈-遍历左子树-弹出结点并访问-遍历右子树
*先序、后序也可实现

3.层序遍历(上下-左右)
二叉树遍历本质:二维结构线性化
访问左儿子后,需要存储结构保存暂时不访问的结点:堆栈(父结点)/ 队列(右儿子)
*层序遍历的队列实现:根结点入队→结点出队、访问该结点、左右儿子入队(循环)

应用
例1:输出叶结点
先序遍历框架,增加判断左右子树是否均为空即可
例2:求二叉树高度
后序遍历框架,=左右子树的最大高度+1(递归)
例3:二元运算表达式树及其遍历
运算数=叶结点,运算符号=非叶结点
先序-前缀表达式
中序-中缀表达式(不准确,受运算符号优先级影响,可通过加括号输出解决)
后序-后缀表达式
例4:由两种遍历序列确定二叉树
中序+先序/后序→确定唯一二叉树,先+后不行(左右不明)
先序+中序:先序根结点→在中序中分解出左右子树→对左右递归继续分解
*先序=中序:无左子树

小白专场:树的同构

数的同构:一棵树可以通过若干次左右子树互换变为另一棵(不可越层互换)
求解思路
1.二叉树表示:链表/数组(当做完全二叉树),结构数组(物理)=静态链表(思想)
2.建二叉树:未出现过的编号=根结点
3.同构判别:特例+分类讨论+递归(逻辑要严密,不能遗漏情况)

你可能感兴趣的:(理论知识)