二叉树的先序中序后序以及递归算法求高度和结点数目

#include "stdio.h"
//定义结点
typedef struct Node
{
    char data;
    struct Node * LChild;
    struct Node * RChild;
}BiTNode,*BiTree;

//创建树
void CreateBiTree(BiTree * bt)
{
    char ch;
    ch = getchar();
    if(ch=='.') *bt=NULL;
    else
    {
        *bt=(BiTree)malloc(sizeof(BiTNode));
        (*bt)->data=ch;
        CreateBiTree(&((*bt)->LChild));
        CreateBiTree(&((*bt)->RChild));
    }
}
//先序遍历二叉树
void PreOrder(BiTree root)
{
    if(root!=NULL)
    {
        printf("%c ",root->data);//访问根结点
        PreOrder(root->LChild);//先序遍历左子树
        PreOrder(root->RChild);//先序遍历右子树
    }
}
//中序遍历二叉树
void InOrder(BiTree root)
{
    if(root!=NULL)
    {
        InOrder(root->LChild);//中序遍历左子树
        printf("%c ",root->data);//访问根结点
        InOrder(root->RChild);//中序遍历右子树
    }
}

//后序遍历二叉树
void PostOrder(BiTree root)
{
    if(root!=NULL)
    {
        PostOrder(root->LChild);//后序遍历左子树
        PostOrder(root->RChild);//后序遍历右子树
        printf("%c ",root->data);//访问根结点
    }
}

//先序遍历输出二叉树的结点
void PreOrder1(BiTree root) //先序遍历输出二叉树的结点,为指向二叉树根结点的指针
{
    if(root!=NULL)
    {
        printf("%c ",root->data);//输出根结点
        PreOrder1(root->LChild);//先序遍历左子树
        PreOrder1(root->RChild);//先序遍历右子树
    }
}

//后序遍历统计二叉树的结点的个数
int leaf(BiTree root)
{
    int LeafCount;
    if(root==NULL)
        LeafCount=0;
    else if((root->LChild==NULL)&&(root->RChild==NULL))
        LeafCount=1;
    else       //叶子数为左右子树的叶子数目之和
        LeafCount=leaf(root->LChild)+leaf(root->RChild);
    return LeafCount;
}

//后序遍历求二叉树高度的递归算法
int PostTreeDepth(BiTree bt)   //后序遍历求二叉树bt高度的递归算法
{
    int hl,hr,max;
    if(bt!=NULL)
    {
        hl=PostTreeDepth(bt->LChild);//求左子树的深度
        hr=PostTreeDepth(bt->RChild);//求右子树的深度
        max=hl>hr?hl:hr;//得到左右子树深度较大的
        return (max+1);//返回树的深度
    }
    else
        return 0;//如果是空树,则返回0
}
//主函数输出
int main()
{
    printf("请输入二叉树:\n");
    BiTree root;
    CreateBiTree(&root);
    printf("先序遍历:\n");//输出先序遍历的结果
    PreOrder(root);
    printf("\n中序遍历:\n");//输出中序遍历的结果
    InOrder(root);
    printf("\n后序遍历:\n");//输出后序遍历的结果
    PostOrder(root);
    printf("\n输出叶子结点:\n");//输出叶子结点
    PreOrder1(root);
    leaf(root);
    printf("\n输出叶子结点数目:\n%d",leaf(root));//输出叶子结点的数目
    PostTreeDepth(root);
    printf("\n输出二叉树的高度:\n%d",PostTreeDepth(root));//输出二叉树的高度
}
//下面是二叉树的输入
/*ABDE..F...CGI...HJ..K.L..*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值