文章目录
- 一、树
- 二、二叉树
- 三、二叉树的特性
-
- 特性1. 包含n (n> 0 )个元素的二叉树边数为n-1
- 特性 2: 若二叉树的高度为h,h≥0,则该二叉树最少有h个元素,最多有2^h-1 个元素
- 特性3:包含n(n≥0)个元素的二叉树的高度最大为n,最小为ceiling(log2(n+1))
- 特性4. 完全二叉树
- 四、二叉树的描述
-
- 4.1 数组描述
- 4.2 链表描述
- 五、二叉树常用操作
- 六、二叉树遍历
-
- 6.1 preOrder前序遍历
- 6.2 inOrder中序遍历
- 6.3 postOrder后序遍历
- 6.4 层次遍历
- 6.5 性能比较
- 6.6 数学表达式的遍历
- 七、二叉树ADT
- 八、树和森林的二叉树描述
- 九、应用
-
- 9.1 信号放大器
- 9.2 并查集,等价类
一、树
用来描述具有层次结构
的数据。
比如:家庭关系、公司组织……
DEF.
树(tree)t是一个非空
的有限
元素的集合.
- 其中一个元素为
根
(root). - 其余的元素(如果有的话)组成t的
子树
(subtrees) - 层次中
最高层的元素
为根 (root) 。 - 其余的元素分成
不相交
的集合。 - 根的下一级的元素是根的
孩子
(children) , 是余下元素所构成的子树的根
。 - 树中没有孩子的元素称为
叶子
(leaves) 级
(level)/层次:指定树根的级为1
,其孩子(如果有)的级为2。 一个元素的级=其父母的级+1
- 二叉树的
高度
(height)或深度(depth)是指该二叉树的级数
(或层数) - 元素的
度
(Degree of an element):是指其孩子的个数
树的度
(The degree of a tree):是其元素度的最大值
二、二叉树
DEF.
- 二叉树( binary tree) t 是
有限
个元素的集合(可以为空
)。 - 当二叉树非空时,其中有一个称为
根
(root)的元素,余下的元素(如果有的话)被分成2个二叉树
,分别称为t的左子树
和右子树
二叉树 VS 树:
- 子树个数:二叉树中每个元素都恰好有
两棵子树
(其中一个或两个可能为空)。而树中每个元素可有任意多个
子树 - 有序性:在二叉树中每个元素的子树都是
有序
的,也就是说,可以用左、右子树
来区别。而树的子树间是无序
的
二叉树经常用来表示数学表达式
,称为表达式树。
三、二叉树的特性
特性1. 包含n (n> 0 )个元素的二叉树边数为n-1
证明:
- 二叉树中每个元素(除了根节点) 有且只有一个父节点
- 在子节点与父节点间有且只有一条边
- 因此,边数为n-1
特性 2: 若二叉树的高度为h,h≥0,则该二叉树最少有h个元素,最多有2^h-1 个元素
最少:
最多:满二叉树
特性3:包含n(n≥0)个元素的二叉树的高度最大为n,最小为ceiling(log2(n+1))
高度最大:
高度最小:
特性4. 完全二叉树
满二叉树:
- 当
高度为h
的二叉树恰好有 2 h − 1 2^h-1 2h−1个元素时,称其为 满二叉树(full binary tree). - 对高度为h 的满二叉树中的元素按
从上到下, 从左到右
的顺序从1到 2 h − 1 2^h-1 2h−1 进行编号
完全二叉树:
- 从满二叉树中删除k个元素,其编号为 2 h − i 2^h-i 2h−i, 1≤i≤k,所得到的二叉树被称为完全二叉树(complete binary tree)
- 也就是说从最右一个叶节点开始
依次连续
向左、向上删除 - 即:深度为k具有n个节点的二叉树是一颗完全二叉树,当且仅当
它与k层满二叉树前1~n个节点所构成的二叉树结构相同
- k层完全二叉树:
1)前k-1层为满二叉树;
2)第k层上的节点都连续排列于第k层的左端 - 满二叉树是完全二叉树的一个特例
- 有n个元素的完全二叉树的深度为 c e i l i n g ( l o g 2 ( n + 1 ) ) ceiling(log_2(n+1)) ceiling(log2(n+1))
完全二叉树的特性:
设完全二叉树中一元素的序号为i, 1≤i≤n。则有以下关系成立
- 当i = 1时,该元素为二叉树的根。若i >1,则该元素父节点的编号为 f l o o r ( i / 2 ) floor(i/2) floor(i/2)
- 当2i >n时,该元素无左孩子。否则,其
左孩子的编号为2i
- 若2i+1>n,该元素无右孩子。否则,其
右孩子编号为 2i+1
四、二叉树的描述
两种描述方法:
- 数组描述
- 链表描述(常用)
4.1 数组描述
完全二叉树:
- 按照二叉树对元素的编号方法,将二叉树的元素存储在数组中
- 编号 与 数组下标 对应
普通二叉树:可以看作是缺少了部分元素的完全二叉树
评价:
- 一个有n个元素的二叉树需要存储空间: [ n + 1 , 2 n ] [n+1 , 2^n] [n+1,2n] (或 [ n , 2 n − 1 ] [n , 2^n -1] [n,2n−1] )
- 右斜(Right-skewed)二叉树存储空间达到最大(只有右子树)
- 当
缺少的元素数目比较少
时,数组描述方法是有效的
4.2 链表描述
最常用。
每个元素存储在一个节点内,节点的结构:
链表二叉树的节点结构:
template<class T>
class binaryTreeNode{
// 元素值
T element;
// 指向孩子节点的指针
binaryTreeNode<T> *leftChild, *rightChild;
// 3个构造函数
// 无参数
binaryTreeNode(){
leftChild = rightChild = NULL;
}
// 只有数据参数
binaryTreeNode(const T& theEle