c语言二叉树的建立,遍历,求根的深度,叶子节点的个数

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    char data;
    struct node *rchild,*lchild;
}node,*linklist;

void preorder_create(linklist *l)//先序创建二叉树
{

    char ch,temp;
    scanf("%c",&ch);
    temp=getchar();
    if(ch=='#')
    {
        *l=NULL;
    }
    else
    {
        (*l)=(node*)malloc(sizeof(node));

        (*l)->data=ch;//每个节点进去都要进行下面两个递归,即输入左子节点和右子节点,而每个内部递归也要进行
        printf("请输入%c的左子节点\n",ch);
        preorder_create(&((*l)->lchild));//*l->rchild当于进行上面的操作、当a的子节点变成#时,这个递归退出,进行下一个递归,即下一语句
        printf("请输入%c的右子节点\n",ch);
        preorder_create(&((*l)->rchild));//当*l->lchild不为#时一直进行该递归,直到满足条件,退出递归,结束该函数
}
}


void preorder_traverse(linklist *l)//先序遍历输出
{
    if((*l)==NULL)
       {
           return;
       }
       printf("%4c",(*l)->data);//从头结点开始,进行左右递归,左右递归的内部再继续进行
       preorder_traverse(&((*l)->lchild));//每个内部也要进行左右两个递归
       preorder_traverse(&((*l)->rchild));
}

void inorder_traverse(linklist *l)//中序遍历输出
{
    if((*l)==NULL)
    {
        return;
    }
    inorder_traverse(&((*l)->lchild));
    printf("%4c",(*l)->data);
    inorder_traverse(&((*l)->rchild));
}

void postorder_traverse(linklist *l)//后序遍历输出
{
    if((*l)==NULL)
    {
        return;
    }
    postorder_traverse(&((*l)->lchild));
    postorder_traverse(&((*l)->rchild));
    printf("%4c",(*l)->data);
}

int TreeDeep(linklist *l)//求二叉树的深度
{
  int deep=0;
    if(*l)
    {
        int leftdeep=TreeDeep(&((*l)->lchild));
        int rightdeep=TreeDeep(&((*l)->rchild));
        deep=leftdeep>=rightdeep?leftdeep+1:rightdeep+1;
    }
    return deep;
}

int life_count(linklist *l)//求叶子节点的个数
{
    static int num=0;
    if((*l)==NULL)//此递归方式与上面相同,保持整个递归可以正常运行
    {
       
        return;
    }
    else
    {
        if(((*l)->lchild)==NULL&&((*l)->rchild)==NULL)//对递归的每个节点进行判断,成立累加
        {
            num++;
        }

    life_count(&((*l)->lchild));
    life_count(&((*l)->rchild));
    }
    return num;//return语句表示整个函数的最终结果为一个值,可以通过变量赋给
}
int main()
{
    linklist a;
    preorder_create(&a);
    preorder_traverse(&a);
    inorder_traverse(&a);
    int deepth,num;
    deepth=TreeDeep(&a);
   printf("%d",deepth);
    num=life_count(&a);
    printf("%d",num);
    //postorder_traverse(&a);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值