C语言 二叉树 统计二叉树中度为0,1和2的结点个数【树和二叉树】给定先序序列,按照该序列创建对应的二叉树,并输出该二叉树度为0,1和2的结点个数。输入:一行,二叉树按先序遍历序列,空指针用字符^占位

Description

给定先序序列,按照该序列创建对应的二叉树,并输出该二叉树度为0,1和2的结点个数。

Input

一行,二叉树按先序遍历序列,空指针用字符^占位

Output

一行,三个整数分别代表该二叉树度为0,1和2的结点个数

Sample Input
ABD^^CEF^

Sample Output
3 1 2

#include
#include
//字符类型
#define  TElemType char 
//二叉树的二叉链表的表示与实现
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//先序创建二叉树 ,假设树中结点为字符型,以^代表为空结点 
BiTree CreateBiTree()
{
	char ch;
	BiTree T;
	ch=getchar();
	if(ch=='^')
		T=NULL;
	else
	{
		T=(BiTNode*)malloc(sizeof(BiTNode));
		T->data=ch;
		T->lchild =CreateBiTree();
		T->rchild =CreateBiTree();
	}
	return T;
}

//统计度为0的结点个数,其值用sum返回 
void countLeaf(BiTree T, int *sum)
{
    if(T)
	 {
	  	if(!T->lchild && !T->rchild)
	   		(*sum)++;
	   	countLeaf(T->lchild,sum);
	   	countLeaf(T->rchild,sum);
	 } 	
}

//统计度为1的结点个数,其值用sum返回 
void countOneChild(BiTree T, int *sum)
{
    if(T)
	 {	  
	 	if(!T->lchild && T->rchild || T->lchild && !T->rchild )
	   		(*sum)++;
	   	countOneChild(T->lchild,sum);
	   	countOneChild(T->rchild,sum);
	 } 	
}

//统计度为2的结点个数,其值用sum返回 
void countTwoChild(BiTree T, int *sum)
{
    if(T)
	 {	  
	 	if(T->lchild && T->rchild )
	   		(*sum)++;
	   	countTwoChild(T->lchild,sum);
	   	countTwoChild(T->rchild,sum);
	 } 	
}
int main()
{
	BiTree T;
	int sum0=0,sum1=0,sum2=0;

	T=CreateBiTree();
	//度为0的结点个数
	countLeaf(T,&sum0);
	printf("%d ",sum0);
	//度为1的结点个数
	countOneChild(T,&sum1);
	printf("%d ",sum1);
	//度为2的结点个数
	countTwoChild(T,&sum2);
	printf("%d",sum2);
	return 0;
 } 


你可能感兴趣的:(数据结构)