二叉树的建立 先序 中序 后序遍历 树的深度 叶子结点个数(C/C++语言实现)

对建立的二叉树进行先序遍历,中序遍历,后序遍历,求树的深度,叶子结点个数。

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

struct btnode
{
    char data;//数据域
    struct btnode *lchild,*rchild;//左孩子,右孩子
};

typedef struct btnode bitreptr;//重新命名
int n=0;

bitreptr* creatbt()//创建二叉树
{
    bitreptr *r;
    char ch;
    scanf("%c",&ch);
    getchar();//吸收回车键
    if (ch==' ')
        r=NULL;
    else
    {
        r=(struct btnode*)malloc(sizeof(struct btnode));
        r->data=ch;
        printf("输入%c的左子树:",ch);
        r->lchild=creatbt();//递归左子树
        printf("输入%c的右子树:",ch);
        r->rchild=creatbt();//递归右子树
    }
    return r;
}

void preorder(bitreptr *r)//先序遍历
{
    if(r)
    {
        printf("%c",r->data);
        preorder(r->lchild);//递归调用
        preorder(r->rchild);
    }
}

void inorder(bitreptr *r)//中序遍历
{
    if(r)
    {
        inorder(r->lchild);
        printf("%c",r->data);
        inorder(r->rchild);
    }
}

void postorder(bitreptr *r)//后序遍历
{
    if(r)
    {
        postorder(r->lchild);
        postorder(r->rchild);
        printf("%c",r->data);
    }
}

int depth(bitreptr *r)//数的深度
{
    int k=0;
    int leftdeep,rightdeep;//定义遍历时的左子树深度和右子树深度
    if(r)
    {
        leftdeep=depth(r->lchild);//左子树的深度
        rightdeep=depth(r->rchild);//右子树的深度
        k=leftdeep>=rightdeep?leftdeep+1:rightdeep+1;//取左右子树最大值,+1是每次递归子树到根结点长度
    }
    return k;
}

int count(bitreptr *r)//树的叶子节点个数
{
    if(r)
    {
        if((r->lchild==NULL)&&(r->rchild==NULL))//判断是否是叶子结点
            n++;
        count(r->lchild);//递归调用
        count(r->rchild);
    }
    return n;
}

void main()
{
    int deep;//深度
    int counts;//叶子结点个数
    bitreptr *R;
    printf("创建二叉树(若某个结点左或右子树为空,则输入空格!)\n");
    printf("输入根结点:");
    R=creatbt();//创建二叉树
    printf("\n先序遍历:");
    preorder(R);//先序遍历
    printf("\n");
    printf("\n中序遍历:");
    inorder(R);//中序遍历
    printf("\n");
    printf("\n后序遍历:");
    postorder(R);//后序遍历
    printf("\n");
    deep=depth(R);//树的深度
    printf("\n树的深度:%d\n",deep);
    counts=count(R);//叶子结点个数
    printf("\n树的叶子结点个数:%d\n",counts);
}

运行结果:
在这里插入图片描述

C++实现

typedef struct BiTNode{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//构造二叉树
BiTree createBiTree(){
    BiTNode *r;
    char s;//结点
    cin>>s;
    if(s=='#'){
        r=NULL;
    }
    else{
        r=(BiTNode *)malloc(sizeof(BiTNode *));
        r->data=s;
        cout<<"输入 "<<s<<" 的左孩子结点('#'表示为空):";
        r->lchild=createBiTree();//递归输入当前根结点的左子树
        cout<<"输入 "<<s<<" 的右孩子结点('#'表示为空):";
        r->rchild=createBiTree();//递归右子树
    }
    return r;
}

void visit(BiTNode *T){
    if(T!=NULL){
        cout<<T->data<<endl;
    }
}

//先序
void PreOrder(BiTree T){
    if(T!=NULL){
        visit(T);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}


//中序遍历
void InOrder(BiTree T){
    if(T!=NULL){
        InOrder(T->lchild);
        visit(T);
        InOrder(T->rchild);
    }
}

//后序
void PostOrder(BiTree T){
    if(T!=NULL){
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        visit(T);
    }
}
  • 24
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值