一、树
1. 二叉树不是树(感觉有争议,说法不一)。树可以为空,叫空树。二叉树是二叉链表(有左右子树的指针),树通常是兄弟孩子链表(有孩子指针,兄弟指针,两个指针)。二叉树区分左右,非有序树不区分左右。
2. 树中一个结点的子结点个数称为该结点的度,树中结点的最大度数称为树的度。
3.度大于0的结点称为分支结点(又称为非终端结点),叶子结点又称为终端结点。
课后题易错:
- 树的路径长度是从树根到每一结点的路径长度的(总和)。
- 树的总结点数等于总分支数加一。
二、二叉树
1. 只有一个结点的二叉树的度为0;
2. 满二叉树:
高度为h,含有2h-1个结点的二叉树。
满二叉树中编号为i的结点,如果有双亲,其双亲为⌊i/2⌋,如果有左孩子,则左孩子为2i;如果有右孩子,则右孩子为2i+1。
- 完全二叉树:
若i<=⌊n/2⌋,则结点为分支结点,否则为叶子结点。
如果有度为1的结点,只可能有一个,且该结点只有左孩子而无右孩子。
- 二叉排序树:左孩子上所有结点的关键字均小于根节点的关键字;右子树上的所有结点的关键字均大于根节点的关键字。左孩子和右孩子又各是一棵二叉排序树。
- 平衡二叉树:树上任一结点的左子树和右子树的深度之差不超过1。
- 二叉树的性质:
1)非空二叉树上叶子结点数等于度为2的结点数加1:N0=N2+1。
多叉树:同理:N0=1+N2+2*N3+3*N4+...
2)非空二叉树上第k层上至多有2k-1个结点(K>=1)。
3)高度为h的二叉树至多有2h-1个结点(H>=1)。
4)对完全二叉树而言,结点i所在层次(深度)为⌊log2i⌋+1。
5)对完全二叉树而言,具有N个(N>0)结点的完全二叉树的高度为⌈log2(N+1)⌉或⌊log2(N)⌋+1。
7. 二叉树的顺序存储结构:
1)二叉树的顺序存储结构就是用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素。(完全二叉树和满二叉树采用顺序存储比较合适)。
2)顺序存储结构显然要从数组下标1开始存储树中的结点,因为从0开始存储不满足上述4)的描述。
3)数组下标既代表了结点的编号,也指示了树中各结点之间的关系。
8. 二叉树的链式存储结构:
1)含有n个结点的二叉链表中含有n+1个空链域。
注:二叉树的存储结构注意与树的三种存储结构区分。
课后易错题:
- 树的习题多用特殊值代入法。
- 二叉排序树插入结点时必定插入在叶节点。
三、二叉树的遍历和线索二叉树
1. 不管采用哪种遍历算法,每个结点都只访问一次且仅访问一次,故时间复杂度都为O(n)。
2. 在递归遍历中,递归工作栈的深度恰好为树的深度。
3. 在树的非递归先序、中序、后序遍历中都可以用栈来实现。而层次遍历需要借助一个队列。
4. 由二叉树的先序序列和中序序列、后序序列和中序序列、层序序列和中序序列都可以唯一确定一棵二叉树。需要注意的是只知道先序和后序序列,无法唯一确定一棵二叉树。
5.线索二叉树:
1)实质就是对一个非线性结构进行线性化操作。
2)线索二叉树是一种物理结构:二叉树是一种逻辑结构,但线索二叉树是加上线索后的链表结构,也就是说,它是二叉树在计算机内部的一种存储结构,所以是一种物理结构。
3)标志域:tag==1时表示指向结点的前驱或后驱。
4)后序线索树的遍历需要栈的支持。
5)求中序线索二叉树中中序序列下的第一个结点:最左下结点,不一定是叶结点。
课后易错题:
- 中序遍历时,n在m前的条件是 n在m左方。
- 后序遍历时,n在m前的条件是 n是m的子孙。
- 中序序列和后序序列中,所有叶子结点的先后顺序 完全相同。
- 非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树 只有一个叶结点(每层只有一个结点)。
- 非空二叉树的先序序列和后序序列正好相同,该二叉树 只有一个根节点。
- 二叉树在线索化后,仍不能有效求解:后序线索二叉树中求后序后继。
四、树、森林
1. 树既可以采用顺序存储结构,也可以采用链式储存结构。
2. 树的三种常用存储结构:双亲表示法、孩子表示法、孩子兄弟表示法(二叉树表示法)。孩子兄弟法即以二叉链表作为树的存储结构。
3.树、森林与二叉树的转换:
树转换为二叉树:左孩子右兄弟。
- 树和森林的遍历:
- 树的遍历主要有:先根遍历、后根遍历(访问顺序与这棵树对应的二叉树的中序遍历顺序相同)。
- 森林的遍历主要有:先序遍历、中序遍历。
课后易错题:
1.每棵树,其结点数比边数多1。所以若说森林有15条边,25个结点。25-15=10,所以一共有10棵树。
五、树与二叉树的应用
1. 二叉排序树:
1)对二叉排序树进行中序遍历,可以得到一个递增的有序序列。
2)插入的新结点一定是某个叶结点。
3)删除:若删除的是叶结点,则直接删除;若结点z只有一棵左子树或或右子树,则让z的子树成为z父节点的子树(替换掉z的位置);若左右子树都不空,则在右子树上找中序第一个子女填补。
4)二叉排序树查找算法的平均查找长度主要取决于树的高度。若是一个只有右(左)孩子的单支树,平均查找长度和单链表相同,为O(n)。若左、右子树的高度之差的绝对值不超过1,则变为平衡二叉树,查找长度达到O(log2n)。
2. 平衡二叉树
1)插入时若导致了不平衡,则找到插入路径上离插入结点最近的平衡因子绝对值大于1的结点A。
2)对A进行调整。LL(右单旋转),RR(左单旋转),LR(先左后右双旋转),RL(先右后左双旋转)
3. 哈夫曼树
1)构造过程中共新建了N-1个结点(双分支结点),因此哈夫曼树中结点总数为2N-1。
2) 哈夫曼树中不存在度为1的结点。
3)如果没有一个编码是另一个编码的前缀,则称这样的编码为前缀编码。
课后题易错:
1. 设Nh表示高度h的平衡二叉树中含有的最少结点数,则有公式N1=1;N2=2;Nh=Nh-1+Nh-2+1。
不同的问法:含有xx个结点的平衡二叉树的最大深度为?高度为xx的平衡二叉树中所有非叶子结点的平衡因子均为1,求结点总数?
2. 二叉排序树查找失败时的查找路径为从根结点到其父节点的结点序列。
3. 最佳二叉排序树应是高度最小的二叉排序树。首先对各关键字从小到大排序,然后仿照折半查找的判定树的构造方法构造二叉排序树,这样得到的就是最佳二叉排序树。