【C语言习题】二叉树的先序、中序、后序遍历

题目内容

构造一颗二叉树,输出其先序、中序、后序遍历序列。

个人解法

#include <stdio.h>
#include <stdlib.h>
#define Overflow -1

typedef char TElemType;

typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *LChild, *RChild;
} BiTNode, *BiTree;

//创建二叉树(先序遍历)
void CreateBiTree(BiTree &T) //构造二叉链表表示的二叉树T
{
    char ch;
    scanf("%c", &ch); //按扩展先序次序输入二叉树中结点的值(一个字符)
    if (ch == '#')    //‘#’字符表示空树
        T = NULL;     //递归结束,建空树
    else
    {
        if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))
            exit(Overflow);
        T->data = ch;            //生成根结点
        CreateBiTree(T->LChild); //构造左子树,并设置T的左孩子指针
        CreateBiTree(T->RChild); //构造右子树,并设置T的右孩子指针
    }
}

//统计二叉树结点总数
int NodeCount(BiTree T)
{
    if (!T) //空树
        return 0;
    else //结点总数 = 左子树结点数 + 右子树结点数 + 根
        return NodeCount(T->LChild) + NodeCount(T->RChild) + 1;
}

//统计二叉树叶子结点数
int LeafCount(BiTree T)
{
    if (!T) //不存在根结点
        return 0;
    if (T->LChild == NULL && T->RChild == NULL) //只有根结点
        return 1;
    else //叶子结点数 = 左子树叶子结点数 + 右子树叶子结点数
        return LeafCount(T->LChild) + LeafCount(T->RChild);
    return 0;
}

//计算二叉树深度
int Depth(BiTree T)
{
    int LDepth, RDepth;
    if (!T)
        return 0;
    else
    {
        LDepth = Depth(T->LChild);
        RDepth = Depth(T->RChild);
        return LDepth > RDepth ? LDepth : RDepth + 1;
    }
}

//先序遍历
void PreOrderTraverse(BiTree T)
{
    if (T)
    {
        printf("%c", T->data);       //访问根结点
        PreOrderTraverse(T->LChild); //递归遍历左子树
        PreOrderTraverse(T->RChild); //递归遍历右子树
    }
}

//中序遍历
void InOrderTraverse(BiTree T)
{
    if (T)
    {
        InOrderTraverse(T->LChild); //递归遍历左子树
        printf("%c", T->data);      //访问根结点
        InOrderTraverse(T->RChild); //递归遍历右子树
    }
}

//后序遍历
void PostOrderTraverse(BiTree T)
{
    if (T)
    {
        PostOrderTraverse(T->LChild); //递归遍历左子树
        PostOrderTraverse(T->RChild); //递归遍历右子树
        printf("%c", T->data);        //访问根结点
    }
}

int main()
{
    BiTree T;
    printf("请依次输入二叉树结点值,并用#表示空树:\n");
    CreateBiTree(T);
    if (T)
    {
        printf("\n先序遍历:\n");
        PreOrderTraverse(T);
        printf("\n中序遍历:\n");
        InOrderTraverse(T);
        printf("\n后序遍历:\n");
        PostOrderTraverse(T);
    }
    else
        printf("创建失败!");
    return 0;
}

运行结果

本人拙作,请大佬们点评。   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值