文章目录
- 一、树
- 二、二叉树
- 三、二叉树的特性
-
- 特性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





![[用AI日进斗金系列]用码上飞在企微接单开发一个项目管理系统!](https://i-blog.csdnimg.cn/direct/664a7c11636445208d95fc0ae8b02689.png)












