王道数据结构课后代码题p175 4.编程求以孩子兄弟表示法存储的森林的叶子结点数。(c语言代码实现)

 当森林(树)以孩子兄弟表示法存储时,若结点没有孩子结点,则它在森林里必是叶子结点,总的叶子结点个数是孩子子树上的叶子数和兄弟子树上的叶结点个数之和。

本题代码如下

int leaves(tree* t)
{
	if (*t == NULL)//树空返回0
		return 0;
	if ((*t)->child == NULL)//结点无左孩子,则该结点必为叶子节点
		return 1 + leaves(&(*t)->brother);//返回叶子结点与它的兄弟子树中的叶子结点
	else
		return leaves(&(*t)->child) + leaves(&(*t)->brother);//孩子子树与兄弟子树中的叶子数之和
}

完整测试代码

#include
#include
typedef struct treenode
{
	char data;
	struct treenode* child, * brother;
}treenode,*tree;
void buildtree(tree* t)
{
	char ch;
	ch = getchar();
	if (ch == '#')
		*t = NULL;
	else
	{
		*t = (treenode*)malloc(sizeof(treenode));
		(*t)->data = ch;
		(*t)->child = NULL;
		(*t)->brother = NULL;
		buildtree(&(*t)->child);
		buildtree(&(*t)->brother);
	}
}
int leaves(tree* t)
{
	if (*t == NULL)//树空返回0
		return 0;
	if ((*t)->child == NULL)//结点无左孩子,则该结点必为叶子节点
		return 1 + leaves(&(*t)->brother);//返回叶子结点与它的兄弟子树中的叶子结点
	else
		return leaves(&(*t)->child) + leaves(&(*t)->brother);//孩子子树与兄弟子树中的叶子数之和
}
int main()
{
	tree t;
	buildtree(&t);
	int cs=leaves(&t);
	printf("孩子兄弟表示法存储的森林有%d个叶结点", cs);
	return 0;
}

用ABD##E##CF##G##测试

/*        A

     B        C

D      E   F      G

对应的森林为

        A                               C                        G

     B                        F                        

D      E        

*/

你可能感兴趣的:(树,数据结构,c语言,算法)