5.编程求以孩子兄弟表示法存储的森林的叶子节点数
当森林以孩子兄弟表示法存储(只要结点没有左孩子,则必定是叶子)时,若结点没有孩子,则必定是叶子,总的叶子结点个数是孩子子树上的叶子树和兄弟子树上的叶节点个数之和。
- 没有左孩子,叶子数=1+兄弟子树叶子数
- 有左孩子,叶子数=孩子子树叶子数+兄弟子树叶子数
typedef struct node{
ElemType data;
struct node *fch,*nsib;
}*Tree;
int Leaves(Tree t){
if(t==NULL) return 0;
if(t->fch==NULL) return 1+Leaves(t->nsib);
else return Leaves(t->fch)+Leaves(t->nsib);
}
6.以孩子兄弟链表为存储结构,请设计递归算法求树的深度(层次遍历)
由孩子兄弟链表表示的树,求高度的算法思想如下:采用递归算法,若树为空,高度为0;否则高度为第一子女树高+1和兄弟子树高度的大者。左孩子右兄弟,只有孩子节点增加高度(只有第一子女+1是树的高度,其余的子女全是作为兄弟,所以不增加1)
int Height(CSTree bt){
int hc,hs;
if(bt==NULL) return 0;
else{ //否则高度取子女高度+1和兄弟子树高度的大者
hc=height(bt->firstchild); //第一子女树高
hs=height(bt->nextsibling); //兄弟树高
if(hc+1>hs) return hc+1;
else return hs;
}
}
7.已知一棵树的层次序列及每个节点的度,编写算法构造此树的孩子-兄弟链表
本题与树的层次序列有关。可设立一个辅助数组pointer[]存储新建树的各节点的地址,再根据层次序列与每个节点的度,逐个链接结点