由于二又树的遍历算法是许多二叉树运算的算法设计的基础,因此遍历算法的应用很广泛。下面将以遍历算法求二叉树的叶子数为例,来加深对二叉树遍历算法的理解。
因为叶子结点是二叉树中那些左孩子和右孩子均不存在的结点,所以可在二叉树的遍历过程中,对这种特殊结点进行计数,来完成叶子结点数的统计。
一棵树的叶子数目等于它的左子树叶子数加上右子树叶子数的总和。而当一个结点没有左子树也没有右子树的时候,即为叶子结点。只要遍历整个树将符合条件的记录就可以得出叶子结点数。
要求:
建立二叉链表,统计二叉树中的叶子结点数并输出。按照完全二叉树的形式输入二叉树的各结点数据(字符),其中虚结点用'@'表示。输入以'#'结束。输出叶子结点的个数及具体值。第一行为为叶子结点的数据值,各数据用空格分隔,第二行为叶子结点的个数。
输入示例:
abc@@de#
输出:
b d e
3
#include<stdio.h>
#include<malloc.h>
#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
写完的一些东西会不定时丢上去。