树、森林 p152 5-7

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[]存储新建树的各节点的地址,再根据层次序列与每个节点的度,逐个链接结点

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值