二叉树的基本操作

实验需求:要求程序能够建立二叉树并实现二叉树的先序中序后序遍历。

代码实现

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

//定义数据类型

typedef char DataType;

//定义二叉树

typedef struct bittree {

    DataType data;

    struct bittree* lchild, * rchild;   //左右子树节点指针

}BinTree;

//--------------函数声明---------------

BinTree* CreateBinTree(BinTree* T);             //前序创建二叉树

void preOrder(BinTree* T);                      //前序遍历

void InOrder(BinTree* T);                       //中序遍历

void PostOrder(BinTree* T);                     //后序遍历

//-------------------------------------

int main()

{

    BinTree* T = (BinTree*)malloc(sizeof(BinTree));     //创建二叉树

    T = CreateBinTree(T);   //接受返回的根结点地址

    printf("前序遍历:");

    preOrder(T);            //前序遍历

    printf("\n");           //换行

    printf("中序遍历:");

    InOrder(T);             //中序遍历

    printf("\n");           //换行

    printf("后序遍历:");

    PostOrder(T);           //后序遍历

    printf("\n");           //换行

    return 0;

}

//先序创建二叉树

BinTree* CreateBinTree(BinTree *T) {

    char d;

    printf("请输入当前节点数据: ");

    scanf("%c", &d);

    getchar();              //用来接收缓冲区内的“回车"

    if (d == '#') {

        T = NULL;  //判断:如果输入的字符串是“#”,将指向孩子节点的指针置空

        return T;

    }

    else {

        T = (BinTree*)malloc(sizeof(BinTree));      //malloc动态分配内存

        if ( T == NULL ) {

            printf("分配空间失败\n");

            return 0;

        }

        T->data = d;

        T->lchild = CreateBinTree(T->lchild);       //接收左孩子节点地址,存放进 T->lchild 左指针内

        T->rchild = CreateBinTree(T->rchild);       //接收右孩子节点地址,存放进 T->rchild 右指针内

    }

    return T;

}

//前序遍历二叉树

void preOrder(BinTree* T) {

    if (T)

    {

        printf("%c ", T->data);     //输出根节点数据

        preOrder(T->lchild);        //遍历左子树

        preOrder(T->rchild);        //遍历右子树

    }

}

//中序遍历二叉树

void InOrder(BinTree* T) {

    if (T) {

        InOrder(T->lchild );        //遍历左子树

        printf("%c ", T->data);     //输出根节点数据

        InOrder(T->rchild );        //遍历右子树

    }

}

//后序遍历

void PostOrder(BinTree* T) {

    if (T) {

        PostOrder(T->lchild);       //遍历左子树

        PostOrder(T->rchild);       //遍历右子树

        printf("%c ", T->data);     //输出根节点数据

    }

}

运行结果展示:

数据一

生成树如下图:

数据二:

生成树如下图:

数据三:

 生成树如下图

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值