一、二叉树
1. 性质
①在二叉树第n层上,至多有2^(n-1)个结点。
②深度为k的二叉树,至多有(2^k)-1个结点。
③对任何一棵二叉树,如果其终端结点数为n0,度为2的结点数为n2。有n0=n2+1
2. 二叉树遍历
①先序遍历
(根左右)先访问根结点(打印)→先序遍历左子树→先序遍历右子树
上图先序遍历结果:1 2 4 6 7 8 3 5
②中序遍历
(左根右)中序遍历左子树→访问根结点(打印)→中序遍历右子树
上图中序遍历结果:4 7 6 8 2 1 3 5
③后序遍历
(左右根)后序遍历左子树→后序遍历右子树→访问根结点(打印)
上图后序遍历结果:7 8 6 4 2 5 3 1
④再举个栗子
上图: 先序 - + a * b - c d / e f
中序 a + b * c - d - e / f
后序 a b c d - * + e f / -
上图为表达式:a+b*(c-d)-e/f
先序、中序、后序 刚好对应着 前缀表达式、中缀表达式、后缀表达式
3. 线索二叉树
- n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")。
- 线索二叉树建立方式:
记ptr指向二叉链表中的一个结点,以下是建立线索的规则:
(1)如果ptr->lchild为空,则存放指向中序遍历序列中该结点的前驱结点。这个结点称为ptr的中序前驱;
(2)如果ptr->rchild为空,则存放指向中序遍历序列中该结点的后继结点。这个结点称为ptr的中序后继;
显然,在决定lchild是指向左孩子还是前驱,rchild是指向右孩子还是后继,需要一个区分标志的。因此,我们在每个结点再增设两个标志域ltag和rtag,注意ltag和rtag只是区分0或1数字的布尔型变量,其占用内存空间要小于像lchild和rchild的指针变量。结点结构如下所示。(1)ltag为0时指向该结点的左孩子,为1时指向该结点的前驱;
(2)rtag为0时指向该结点的右孩子,为1时指向该结点的后继;
二、平衡二叉查找树
三、红黑树
四、B树
五、其他
1. 先、中、后序互求
①已知前、中,求后序
前序用来确定根结点,第一个是最开始的根结点;
中序用来确定左右子树,在根结点左边为左子树,在右边为右子树;
根据这递推画出树,再由树写出后序
例:由下面的可以画出上图
前:GDAFEMHZ
中:ADEFGHMZ
②已知中、后,求前序
后序用来确定根结点,最后一个是最开始的根结点;
中序用来确定左右子树,在根结点左边为左子树,在右边为右子树;
根据这递推画出树,再由树写出前序
例:由下面的可以画出上图
后:AEFDHZMG
中:ADEFGHMZ