目录
0. 前言
数据的逻辑结构
之前的学习一直是围绕着线性结构,它的逻辑结构是一对一的:任意元素的前驱与后继都只有一个。而从现在开始就迈入了非线性结构的学习。
1. 树的定义与一些基本术语
树是一种经典的递归结构。
树的几种表示方式
以中间的表示方式最经典也最直观。
树的基本术语
树的深度/高度:4。
结点的直接前驱称为parents, 所有前驱称为祖先ancestors; 直接后继称为child, 所有后继称为deancestors
结点的度:A=3,B=2,树的度=最高度的结点=A的度=D的度=3
根节点也是分支结点,非终端结点;除了根节点以外的分支结点(有child)都叫内部节点,没有child的叫终端结点
有序树与无序树
当改变子树的顺序时,仍然看作是同一颗树,则称为无序树。
树与森林
树一定是森林,一棵树也可以是森林。
但森林不一定是树,需要加一个公共parent结点就成了树
2. 二叉树的概念与特点
定义与特点
二叉树可以有0个结点,此时它就是空集。二叉树的子树也可以是空集,但有顺序之分。
二叉树与树是两个概念
注意:二叉树与树是两种不同的定义,不能看成是特殊情况下的树。
例:同样是A,B组成的二叉树和树不相同。
例:同结点数量的二叉树与树,拥有不同形态数量
二叉树的五种形态
二叉树的ADT定义
基本操作众多,这里只举部分例子
第一个创建二叉树CreateBiTree中definition为二叉树的建立形式,而这其实可以通过二叉树的遍历方式。
满二叉树的定义与特点
满二叉树在同深度的二叉树中有最多的结点和叶子。
思考:你能想出几种方式判断下图不是满二叉树?请使用编程思想。
1. 从满二叉树的定义入手。满二叉树的结点数量为,k=4代入得15,而图中只有9个结点,故不是二叉树。(可以作为编程中判断二叉树是否满的条件)
2. 从每层都满的性质入手。最后一层结点数<(二叉树的性质1)不满,所以不是二叉树。
3. 从叶子全部在最底层的性质入手。遍历所有n0,发现它们深度(k=3与k=4)不同,故非二叉树。
完全二叉树的定义与特点
定义
对比同深度的满二叉树,结点的顺序能与之保持一致的树称为完全二叉树
一些例子
特点
1. 叶子只可能在最底层或倒数第二层
2. 任意结点的左右子树深度最多差1
思考:满二叉树和完全二叉树的关系?
答:满二叉树一定是完全二叉树,完全二叉树却不一定是满二叉树。
3. 树的应用案例
利用哈夫曼树高效率编码
可以获取不等长(节约空间)的前缀码(准确无歧义,如收到0不会认为是a或b的第一位)