本文基于Coursera北大课程《数据结构基础》,所有文中非标注图片均来自课件,侵删
目录
2.1.1 前序遍历(preorder traversal)
2.1.3 后序遍历(postorder traversal)
4. 二叉搜索树(Binary Search Tree, BST)
1. 二叉树(binary tree)概念
1.1 二叉树定义
二叉树由结点的有限集合构成,该集合可以为空集,也可以是由一个根节点(root)和两棵互不相交、分别称作根的左子树(left subtree)和右子树(right subtree)组成。
1.2 二叉树的五种形态
空左、空右、左右都空、独根(左右都不空)、整个都空(连根都没有)。
1.3 二叉树相关术语
(1)边:两个结点的有序对,称作边。有序代表有方向,事实上二叉树是从父结点发向子结点的,是有方向的,但是一般可以省略不写。如下图所示。从A到B的这个过程就 是一个边。
(2)层数:根为第0层,其它结点每下降一次为一层。
(3)深度:层数最大的叶结点的层数。
(4)高度:层数最大的叶结点的层数加1。
在上图的例子中,深度是2,高度是3。
1.4 几种特殊的二叉树
1.4.1 满二叉树
如果一棵二叉树的任何结点或是树叶恰好都有两棵非空结点,那么它就是一个满二叉树。
1.4.2 完全二叉树
最多只有最下面的两层结点度数可以小于2,最下一层的结点都集中在最左边。
1.4.3 扩充二叉树
所有空子树都增加空树叶,使得外部路径总长度E和内部路径长度I满足:E=I+2n, n为内部结点个数。
1.4.4 表达式二叉树
通过二叉树的不同遍历(会在2.1 讲到遍历方式)来输出不同的表达式。
——摘自课程
1.5 二叉树主要性质
- 二叉树第i层上最多有2^i个结点(i>=0)
- 深度为k的二叉树至多油w^(k+1)-1个结点(k>=0)
- 二叉树的终端结点(度为0的结点,即没有子树的结点)数n0与度为2的结点数(即有两个结点)为n2有关系:n0=n2+1 。如下图所示,n0=3, n2=2, 满足n0=n2+1。
- 【满二叉树定理】非空满二叉树树叶数目等于其分支节点数加1. 例如,如下图所示,树叶(度为0的结点)数目为4,分支结点(度不为0的结点)数目为3,所以4=3+1
- 【满二叉树定理推论】一个非空二叉树的空子树数目等于其结点数加1.(接上图例子,4=3+1)
- 有n个结点的完全二叉树的高度为log_{2}^{n+1},深度为log_{2}^{n+1}-1
2. 二叉树的抽象数据类型
抽象数据类型:逻辑结构+运算
2.1 深度优先搜索(DFS)
顾名思义深搜是按照二叉树深度遍历的。
二叉树深搜栈的深度和树的高度有关,最好是O(log n),最坏为O(n)。
以下三种遍历访问方法的根本区别是根结点在什么时候被访问。在三种遍历中,每个结点都只被访问过一次,因此时间代价为O(n)。
2.1.1 前序遍历(preorder traversal)
tLR次序
- 访问根结点
- 按前序遍历左子树
- 按前序遍历右子树
2.1.2 中序遍历(inorder traversal)
LtR次序
- 按中序遍历左子树
- 访问根结点
- 按中序遍历右子树
2.1.3 后序遍历(postorder traversal)
LRt次序
- 按后序遍历左子树
- 按后序遍历右子树
- 访问根结点