这些概念点来自:严慧敏 《数据结构》
树形结构是一类非常重要的数据结构;
树的一些知识点:在任意非空树种,1.有且仅有一个特定的称为根的节点,比如图(b)中的A;
2.当n>1时,其余节点可分为m个不相交的有限集T1,T2,,,,,,,Tm,其中每一个集合本身又是一棵树,称为根的子树,比如T1={B,E,F,K,L}
一些基本术语:
1.结点:包含一个数据元素和若干指向其子树的分支。
2.结点的度:结点拥有的子树数,比如 节点B的度就是2。
3.叶子、终端结点:度为0 的结点,比如K,L,M
4.树的度:树内各结点度的最大值,比如b树的度是3
5.结点的层次:根为第一层,根的孩子为第二层,某结点在L层,那么该结点的子树的根在L+1层,双亲在同一层的结点互为堂兄弟;
6.树的深度:树中结点的最大层次称为树的深度。
7.森林:m棵互不相交树的集合,对树中每个结点,其子树的集合就是森林。
二叉树:每个结点至多只有两颗子树,并且二叉树的子树有左右之分,次序不能颠倒。
满二叉树:一颗深度为k且有2^k-1个结点的二叉树称为满二叉树,
完全二叉树:完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
问题:1.含有N个结点的二叉链表有N+1个空链域
解释:因为N个结点一共是有2N个链域,然后链表的结构中我们可以发现一个结点上接一个链域(要么是左链域,要么是右链域),也就是说一个指针指向一个结点,所以一共有N个结点,然后因为根是没有指针指向它的,所有一共用掉的指针域就是N-1个,所以空余的就是N+1;
2.为什么叫先序遍历,中序遍历,后序遍历
解释:这个先,中,后是 遍历根的位置顺序,先序,就是先遍历根,然后再左右;中序,就是根在中间,左-根-右;后序,就是左-右-根;
3.遍历的过程是怎么样的,
解释:遍历的过程其实是一个递归的过程,不停的调用函数,比如先序遍历大概的算法是这样的:
visit(T){
printf(T->data);
visit(T->lchild);
visit(T->rchild);
}
我们看一下这样的一棵树,
它的遍历过程是:
printf(A->data);
visit(A->lchild);
visit(A->rchild);
printf(B->data);
visit(B->lchild);
visit(B->rchild);
执行顺序:先printf(B),进入visit(B->lchild),即visit(D)函数:
printf(D->data);
visit(D->lchild);
visit(D->rchild);
然后执行顺序:printf(D),进入printf(D->lchild),然而D->lchild为空,所以执行下一条语句visit(D->rchild)
即visit(F)函数:
printf(F->data);
visit(F->lchild);
visit(F->rchild);
然后执行顺序:printf(F),因为F->lchild,F->rchild都是为空,所以,visit执行完毕;
然后因为visit(F)执行完,即visit(D->rchild)执行完,visit(D)执行完,visit(B->lchild)执行完;
接下来执行visit(B->rchild),因为B->rchild为空,所以visit(B)执行完毕,所以进入visit(A->rchild),即visit(C);
printf(C->data);
visit(C->lchild);
visit(C->rchild);
然后执行顺序是:printf(C),然后visit(C->lchild) 即visit(E):
printf(E->data);
visit(E->lchild);
visit(E->rchild);
执行顺序:printf(E),然后因为E的左右都是空,所以visit(E)执行完毕,
然后执行visit(C->rchild),因为为空,所以visit(C)执行完毕;
至此遍历完成。
所以遍历顺序是:A-B-D-F-C-E