C语言利用二叉树的操作实现输出二叉树中树叶的个数,1度节点的个数,2度节点的个数
欢迎批评指正
@Yelihu
Description
计算二叉树中的度为0、度为1和度为2的结点数。
要求:
(1)存储结构采用二叉链表。
(2)输入先序遍历序列,建立二叉树,空结点用#代替。
(3)输出度为0,度为1和度为2的结点数。
Input
输入先序遍历序列,空结点用#代替。
Output
输出度为0、度为1和度为2的结点数,以空格分隔。
Sample Input
HDB#A##C##G#FE###
Sample Output
3 3 2
HINT
如题目所示,这是一个二叉图求各种节点个数的题目。我们可以先把样例先画出来
对于采取先序顺序生成的二叉树的话,确实是这样,并且检查过后,树叶的个数,1度节点的个数,2度节点的个数和样例输出
完全一致。
那我们怎么判断他是树叶呢?树叶有个特点就是,他的左右子树的指针全部为NULL
类推1度节点的个数的话,就是要么左子树的指针为NULL,要么就是右子树的指针为NULL,2度节点的个数就是左右子树的指针都有下一个子树指向着。
理清了思路,我们就好开始写代码。首先我们需要定义并创建一个二叉树
#include<stdio.h>
typedef struct node{
char data;
struct node *lChild, *rChild;
}BinTree;
BinTree* CreateBinTree(){
BinTree* bt = NULL;
char s;
scanf("%c",&s);
if(s=='#'){
bt = NULL;
}else{
bt = (BinTree*)malloc(sizeof(BinTree));
bt->data = s;
bt->lChild = CreateBinTree();
bt->rChild = CreateBinTree();
}
return bt;
}
既然要求先序的顺序 遍历序列,先序的顺序我们都知道,是先根节点,然后在左子树节点,再是右子树节点。
既然要利用二叉树的递归定义,那我们必须要注意这个递归调用的函数的写法。
void CountNode(BinTree *bt,int* count,int* count1,int* count2)
{
if(bt)
{
if((bt->lChild==NULL)&&(bt->rChild==NULL))
(*count)++;
if((bt->lChild==NULL)&&(bt->rChild!=NULL)||(bt->lChild!=NULL)&&(bt->rChild==NULL))
(*count1)++;
if((bt->lChild!=NULL)&&(bt->rChild!=NULL))
(*count2)++;
CountNode(bt->lChild,count,count1,count2);
CountNode(bt->rChild,count,count1,count2);
}
}
传入四个指针,方便数据的传递和修改。
bt是指向结构体的指针不必多说,count0、1、2分别代表树叶的个数,1度节点的个数,2度节点的个数
在判断完成之后对这些计数器进行加法操作(从0开始➕),然后在进入递归调用的过程中去。
最后就能遍历到所有的节点进行判断。
全部代码如下
#include<stdio.h>
typedef struct node{
char data;
struct node *lChild, *rChild;
}BinTree;
BinTree* CreateBinTree(){
BinTree* bt = NULL;
char s;
scanf("%c",&s);
if(s=='#'){
bt = NULL;
}else{
bt = (BinTree*)malloc(sizeof(BinTree));
bt->data = s;
bt->lChild = CreateBinTree();
bt->rChild = CreateBinTree();
}
return bt;
}
void CountNode(BinTree *bt,int* count,int* count1,int* count2)
{
if(bt)
{
if((bt->lChild==NULL)&&(bt->rChild==NULL))
(*count)++;
if((bt->lChild==NULL)&&(bt->rChild!=NULL)||(bt->lChild!=NULL)&&(bt->rChild==NULL))
(*count1)++;
if((bt->lChild!=NULL)&&(bt->rChild!=NULL))
(*count2)++;
CountNode(bt->lChild,count,count1,count2);
CountNode(bt->rChild,count,count1,count2);
}
}
int main(){
int node0=0;
int node1=0;
int node2=0;
int result=0;
BinTree *p=NULL;
p = CreateBinTree();
CountNode(p,&node0,&node1,&node2);
printf("%d %d %d ",node0,node1,node2);
return 0;
}