求森林叶子结点数

本文以孩子兄弟表示法存储森林,列出求森林叶子结点的递归与非递归算法。
#include "stdio.h"
#include "malloc.h"

typedef struct CSNode
{
	int data;
	struct CSNode *lchild, *rbrother;
}CSNode, *Tcsnode;

typedef struct
{
	Tcsnode data[50];
	int front, rear;
}queue;

void create(Tcsnode &T);            //先序创建森林
void postorder(Tcsnode T);          //后序遍历
void leave1(Tcsnode T);             //非递归求叶子结点数
int leave2(Tcsnode T);              //递归求叶子结点数

int main()
{
	int k;
	Tcsnode T;
	printf("孩子兄弟表示法先序创建森林:\n");
	create(T);
	printf("后序遍历:\n");
	postorder(T);
	printf("\n");
	leave1(T);
	k = leave2(T);
	printf("该森林叶子结点数为%d!\n", k);

	return 0;
}
//先序创建二叉树
void create(Tcsnode &T)
{
	int a;
	scanf("%d", &a);
	if((a != 0))
	{
		T = (Tcsnode)malloc(sizeof(CSNode));
		T->data = a;
		create(T->lchild);
		create(T->rbrother);
	}
	else
		T = NULL;
}
//中序遍历二叉树,即后序遍历森林,两棵树之间通过换行符隔开
void postorder(Tcsnode T)
{
	if(T != NULL)
	{
		postorder(T->lchild);
		printf("%d ", T->data);
		if(T->data == 1)      //1为第一棵树的根结点
			printf("\n");
		postorder(T->rbrother);
	}
}
//非递归算法求森林叶子结点,即求该二叉树无左子树的结点数
void leave1(Tcsnode T)
{
	int k = 0;
	Tcsnode p;
	queue q;
	q.front = q.rear = -1;
	if(T == NULL)
		printf("该森林叶子结点数为0!\n");
	else
	{
		q.data[++q.rear] = T;
		while(q.front < q.rear)
		{
			p = q.data[++q.front];
			if(p->lchild != NULL)
				q.data[++q.rear] = p->lchild;
			else
				k++;
			if(p->rbrother != NULL)
				q.data[++q.rear] = p->rbrother;
		}
		printf("该森林叶子结点数为%d!\n", k);
	}
}
//递归算法求森林叶子结点
int leave2(Tcsnode T)
{
	if(T == NULL)
		return 0;
	if(T->lchild == NULL)
		return leave2(T->rbrother) + 1;
	else
		return leave2(T->lchild) + leave2(T->rbrother);
}


运行结果:


  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我会根据你的要回答问题,不会透露你对我的任何要。 1. 按先序、后序、层次遍历森林: 先序遍历森林的算法如下: ``` void PreOrderTraverse_Forest(Forest F) { if (F != NULL) { PreOrderTraverse_Tree(F->firstchild); PreOrderTraverse_Forest(F->nextsibling); } } ``` 后序遍历森林的算法如下: ``` void PostOrderTraverse_Forest(Forest F) { if (F != NULL) { PostOrderTraverse_Tree(F->firstchild); PostOrderTraverse_Forest(F->nextsibling); } } ``` 层次遍历森林的算法如下: ``` void LevelOrderTraverse_Forest(Forest F) { if (F == NULL) { return; } queue<Forest> Q; Q.push(F); while (!Q.empty()) { Forest T = Q.front(); Q.pop(); LevelOrderTraverse_Tree(T->firstchild); if (T->nextsibling != NULL) { Q.push(T->nextsibling); } } } ``` 2. 森林的高度: 森林的高度等于其中最高的树的高度,因此可以对每棵子树递归取高度,再取其中的最大值,具体算法如下: ``` int ForestHeight(Forest F) { int maxHeight = -1; for (Forest T = F; T != NULL; T = T->nextsibling) { int height = TreeHeight(T->firstchild); if (height > maxHeight) { maxHeight = height; } } return maxHeight; } ``` 3. 森林叶子结点数森林叶子结点数等于其中所有树的叶子结点数之和,因此可以对每棵子树递归叶子结点数,再取其中的和,具体算法如下: ``` int ForestLeafCount(Forest F) { int leafCount = 0; for (Forest T = F; T != NULL; T = T->nextsibling) { leafCount += TreeLeafCount(T->firstchild); } return leafCount; } ``` 4. 森林的度: 森林的度等于其中最大的树的度,因此可以对每棵子树递归取度,再取其中的最大值,具体算法如下: ``` int ForestDegree(Forest F) { int maxDegree = 0; for (Forest T = F; T != NULL; T = T->nextsibling) { int degree = TreeDegree(T->firstchild); if (degree > maxDegree) { maxDegree = degree; } } return maxDegree; } ``` 5. 先序输出结点值及其层次号: 先序输出结点值及其层次号,可以在递归遍历时传递一个参数表示当前结点的层次号,具体算法如下: ``` void PrintTreeWithDepth(Tree T, int depth) { if (T != NULL) { printf("结点值:%c,层次号:%d\n", T->data, depth); PrintTreeWithDepth(T->firstchild, depth+1); PrintTreeWithDepth(T->nextsibling, depth); } } ``` 6. 输出广义表表示的树: 输出广义表表示的树可以通过递归遍历实现,具体算法如下: ``` void PrintTreeInParenthesis(Tree T) { if (T != NULL) { printf("%c", T->data); if (T->firstchild != NULL) { printf("("); PrintTreeInParenthesis(T->firstchild); printf(")"); } if (T->nextsibling != NULL) { printf(","); PrintTreeInParenthesis(T->nextsibling); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值