树基本定义
- n个结点的最小无环图
- 根结点没有前驱,其他结点有且仅有一个前驱
- 一个结点的子结点个数称为该结点的度,树中结点的最大度称为树的度
- 度大于0的结点称为分支结点,度为0的结点称为叶子结点(终端结点)
- 结点的层次从树根开始定义(根结点为第一层),深度从根结点自顶向下累加,高度从叶结点自底向上累加
- 路径是两结点之间经过的结点序列,路径长度是路径上经过的边的个数
树的性质
- 树中结点数=结点度数和+1
- 度为m的树中第i层上至多有m^{i-1}个结点(i >= 1)
- 高度为h的m叉树至多有 (m^h-1)(m-1) 个结点
- 具有n个结点的m叉树的最小高度为 log_m(n * (m-1) + 1)
二叉树
- 度为2,结点有左右之分
- 二叉树!=度为2的有序树
- 满二叉树:高为h,且含有2^h-1个结点
- 完全二叉树:n个结点,高度h,且每个结点都与高度为h的满二叉树中编号为1~n的结点一一对应
- [n/2]+1~n为叶子结点(叶子结点只出现在层次最大的两层)
- 最多有一个度为1的结点(n必为偶数且结点编号必为n/2),且该结点有左孩子无右孩子
二叉树性质
- 非空二叉树的叶子结点数=度为2的结点数+1(n_0 = n_2 + 1)
- 总结点数 n = n_1 + 2 * n_2 + 1
- 由上式又可推得n_1(度为1的结点数)必为奇数
二叉树的存储结构
顺序存储
- 适合完全二叉树和满二叉树
- 编号为i(i > 1)的结点的父结点为[i/2],i为偶数是左孩子,i为奇数是右孩子
- 相应的,结点i的左孩子编号为2i,右孩子为2i+1
链式存储结构
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild, * rchild;
}BiTNode, * BiTree;
二叉树的遍历
NLR先序遍历
void preOrder(BiTree T){
if(T != NULL){
visit(T);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
LNR中序遍历
void inOrder(BiTree T){
if(T != NULL){
preOrder(T->lchild);
visit(T);
preOrder(T->rchild);
}
}
LRN后序遍历
void postOrder(BiTree T){
if(T != NULL){
preOrder(T->lchild);
preOrder(T->rchild);
visit(T);
}
}
线索二叉树
规定:若无左子树,令lchild指向其前驱结点;若无右子树,令rchild指向其后继结点。同时增加两个标识位表明指针含义
以中序线索二叉树为例:
void inThread(ThreadTree &p, ThreadTree &pre){
if(p != NULL){
inThread(p->lchild,pre);
if(p->lchild == NULL){
p->lchild = pre;
p->ltag = true;
}
if(pre != NULL && pre->rchild == NULL){
pre->rchild = p;
pre->rtag = true;
}
pre = p;
inThread(p->rchild, pre);
}
}
//调用和尾结点处理
void createInThread(ThreadTree T){
ThreadTree pre = NULL;
if(T != NULL){
inThread(T);
pre->rchild = NULL;
pre=>rtag = 1;
}
}
遍历中序线索二叉树时,若右标志为真,后继为rchild所指结点,否则为rchild最坐下的结点。
遍历先序线索二叉树时,有左孩子时左孩子为后继,只有右孩子时右孩子为后继,叶子节点的右链域为后继
遍历后序线索二叉树时,右孩子或没有右兄弟的左孩子后继为其父结点,有右兄弟的左孩子后继为其右兄弟
2130

被折叠的 条评论
为什么被折叠?



