C语言利用二叉树的操作实现输出二叉树中树叶的个数,1度节点的个数,2度节点的个数

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;
}

猜你喜欢

转载自blog.csdn.net/Xenoverse/article/details/83154994