二叉树的创建,先中后序输出,计算叶子结点数目

时间:2022-01-24 11:14:44
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct BiTNode
{
    char data;
    struct BiTNode *l;
    struct BiTNode *r;
} BiTNode,*BiTree;
void CreatBiTree(BiTree &T)
{
    ///按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T;
    char ch;
    scanf("%c",&ch);
    if(ch=='#')
        T=NULL;
    else
    {
        T=new BiTNode;
        T->data=ch;
        CreatBiTree(T->l);
        CreatBiTree(T->r);
    }
}
void PreOrderTraverse(BiTree T)///先序遍历二叉树
{
    if(T)
    {
        printf("%c",T->data);
        PreOrderTraverse(T->l);
        PreOrderTraverse(T->r);
    }
}

void MidOrderTraverse(BiTree T)///中序遍历二叉树
{
    if(T)
    {
        MidOrderTraverse(T->l);
        printf("%c",T->data);
        MidOrderTraverse(T->r);
    }
}
void AfOrderTraverse(BiTree T)///后序遍历二叉树
{
    if(T)
    {
        AfOrderTraverse(T->l);
        AfOrderTraverse(T->r);
        printf("%c",T->data);
    }
}
int Count(BiTree T){ //计算叶子结点的数目(利用递归)
    if(T== NULL){
        return 0;
    }
    else if ((T->l==NULL) && (T->r==NULL)){
        return 1;
    }
    else{
        return Count(T->l)+Count(T->r);
    }
}
int main()
{
    BiTree T;
    CreatBiTree(T);
    printf("先序遍历为\n");
    PreOrderTraverse(T);
    printf("\n");
    printf("中序遍历为\n");
    MidOrderTraverse(T);
    printf("\n");
    printf("后序遍历为\n");
    AfOrderTraverse(T);
    printf("\n");
    printf("输出叶子结点数:%d\n",Count(T));
    return 0;
}

二叉树的创建,先中后序输出,计算叶子结点数目

 

(首先用#号填充,使二叉树的叶子结点全部为#)

输入:AB#CD##E##F#GH###

输出见下图:

二叉树的创建,先中后序输出,计算叶子结点数目

计算二叉树的所有叶子节点的数量:

当一个节点的左孩子和右孩子都为空时,它是叶子节点。

使用递归如果能找到就返回1,如果节点为NULL返回0,否则返回count(t->lchild)+ count(t->rchild)