XDOJ-270 统计二叉树中的叶子结点数


由于二又树的遍历算法是许多二叉树运算的算法设计的基础,因此遍历算法的应用很广泛。下面将以遍历算法求二叉树的叶子数为例,来加深对二叉树遍历算法的理解。

因为叶子结点是二叉树中那些左孩子和右孩子均不存在的结点,所以可在二叉树的遍历过程中,对这种特殊结点进行计数,来完成叶子结点数的统计。

一棵树的叶子数目等于它的左子树叶子数加上右子树叶子数的总和。而当一个结点没有左子树也没有右子树的时候,即为叶子结点。只要遍历整个树将符合条件的记录就可以得出叶子结点数。

要求:

建立二叉链表,统计二叉树中的叶子结点数并输出。按照完全二叉树的形式输入二叉树的各结点数据(字符),其中虚结点用'@'表示。输入以'#'结束。输出叶子结点的个数及具体值。第一行为为叶子结点的数据值,各数据用空格分隔,第二行为叶子结点的个数。

输入示例:

abc@@de#

输出:

b d e
3

#include
#include
#define MAXSIZE 1024

typedef struct node {
	char data;		//字符项
	struct node* lchild, * rchild;	//左右子树
}Bitree;
Bitree root;

Bitree* CreateTree();
int CountLeaf(Bitree* p);

int main() {
	Bitree *tree = CreateTree();
	int sum = CountLeaf(tree);
	printf("\n");
	printf("%d", sum);
	return 0;
}
int CountLeaf(Bitree *p){
	if(!p)
		return 0;
	else if(p->lchild==NULL&&p->rchild==NULL){
		printf("%c ", p->data); 
		return 1;
	}
	else
		return CountLeaf(p->lchild)+CountLeaf(p->rchild);
}

Bitree* CreateTree() {
	char ch;
	Bitree* Q[MAXSIZE];
	int front = 1, rear = 0;
	Bitree* root, * s;
	root = NULL;
	while ((ch = getchar()) != '#') {
		s = NULL;
		if (ch != '@') {
			s = (Bitree*)malloc(sizeof(Bitree));
			s->data = ch;
			s->lchild = NULL;
			s->rchild = NULL;
		}
		rear++;
		Q[rear] = s;
		if (rear == 1)
			root = s;
		else {
			if (s && Q[front]) {
				if (rear % 2 == 0) {
					Q[front]->lchild = s;
				}
				else
					Q[front]->rchild = s;
			}
			if (rear % 2 == 1)
				front++;
		}
	}
	return root;
}

欢迎大家关注:https://github.com/XDUgaile

写完的一些东西会不定时丢上去。

你可能感兴趣的:(Data-Structure,xdoj,算法,数据结构,c++,链表)