数据结构--二叉树基本操作函数(先、中、后、层次遍历,含全部代码)

数据结构–二叉树基本操作函数(先、中、后、层次遍历,含全部代码)

Project: 二叉树(BiTree)
Date: 2020/02/01
Author: WX_timi

InitTree(BiTree &T) 参数T,二叉树根节点 作用:初始化二叉树,先序递归创建
PreOrder(BiTree T) 参数T,二叉树根节点 作用:先序遍历二叉树,递归方式
InOrder(BiTree T) 参数T,二叉树根节点 作用:中序遍历二叉树,递归方式
PostOrder(BiTree T) 参数T,二叉树根节点 作用:后序遍历二叉树,递归方式
LevelOrder(BiTree T)参数T,二叉树根节点 作用:层序遍历二叉树,递归方式
CreateBiTree(BiTree &T) 参数T,二叉树根节点 作用:调用InitTree,创建二叉树
Traverse(BiTree T) 参数T,二叉树根节点 作用:PreOrder InOrder PostOrder LevelOrder遍历二叉树

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<algorithm>
#include<iostream>
#define TElemType int
using namespace std;

//链式二叉树数据结构
typedef struct BiTNode
{
    TElemType data;//数据域
    struct BiTNode *lchild, *rchild;//左右孩子
} BiTNode, *BiTree;

//********************************基本操作函数********************************//
//创建二叉树 规定数据域为-1,则为空 先序创建
int InitTree(BiTree &T)
{
    TElemType a;
    scanf("%d", &a);
    if (-1 == a) T = NULL;
    else
    {
        T = (BiTree)malloc(sizeof(BiTNode));
        T->data = a;
        InitTree(T->lchild);
        InitTree(T->rchild);
    }
    return 0;
}

//先序遍历-递归
//先序遍历 按照逻辑来说,执行这个函数前,应该进行逻辑判断(树是否为空),放在里面的话也没有else进行输出提示,不太好
//这里就按照课本敲代码了,在对应功能实现函数进行逻辑判断
void PreOrder(BiTree T)
{
    if (T != NULL)
    {
        printf("%d ", T->data);
        PreOrder(T->lchild);//递归先序遍历左右子树
        PreOrder(T->rchild);
    }
}

//中序遍历-递归
void InOrder(BiTree T)
{
    if (T != NULL)
    {
        InOrder(T->lchild);//递归中序遍历左右子树
        printf("%d ", T->data);
        InOrder(T->rchild);
    }
}

//后序遍历-递归
void PostOrder(BiTree T)
{
    if (T != NULL)
    {
        PostOrder(T->lchild);//递归后序遍历左右子树
        PostOrder(T->rchild);
        printf("%d ", T->data);
    }
}

//层序遍历
void LevelOrder(BiTree T)
{
    queue<BiTNode> q;//借助队列
    if (T != NULL)
    {
        BiTNode temp;//暂存要出队的结点
        q.push(*T);//根结点入队
        while (!q.empty())//队列非空
        {
            temp = q.front();
            q.pop();
            printf("%d ", temp.data);
            if (temp.lchild != NULL) q.push(*temp.lchild);//队列先进先出,先入左孩子
            if (temp.rchild != NULL) q.push(*temp.rchild);
        }
    }
}

//**********************************功能实现函数*****************************//
//调用InitTree
void CreateBiTree(BiTree &T)
{
    printf("请按照先序遍历输入二叉树(-1无):");
    InitTree(T);
    printf("二叉树先序遍历序列:");
    PreOrder(T);
    printf("\n");
}

//遍历功能函数 调用PreOrder InOrder PostOrder LevelOrder
void Traverse(BiTree T)
{
    int choice;
    while (1)
    {
        printf("********1.先序遍历    2.中序遍历*********\n");
        printf("********3.后序遍历    4.层次遍历*********\n");
        printf("********5.返回上一单元\n");
        printf("请输入菜单序号:\n");
        scanf("%d", &choice);
        if (5 == choice) break;
        switch (choice)
        {
        case 1:
        {
            printf("二叉树先序遍历序列:");
            PreOrder(T);
            printf("\n");
        }
        break;
        case 2:
        {
            printf("二叉树中序遍历序列:");
            InOrder(T);
            printf("\n");
        }
        break;
        case 3:
        {
            printf("二叉树后序遍历序列:");
            PostOrder(T);
            printf("\n");
        }
        break;
        case 4:
        {
            printf("二叉树层次遍历序列:");
            LevelOrder(T);
            printf("\n");
        }
        break;
        default:
            printf("输入错误!!!\n");
            break;
        }
    }
}

//菜单
void menu()
{
    printf("********1.创建    2.遍历*********\n");
    printf("********3.退出\n");
}

//主函数
int main()
{
    BiTree T = NULL;
    int choice = 0;
    while (1)
    {
        menu();
        printf("请输入菜单序号:\n");

        scanf("%d", &choice);
        if (3 == choice) break;
        switch (choice)
        {
        case 1:
            CreateBiTree(T);
            break;
        case 2:
            Traverse(T);
            break;
        default:
            printf("输入错误!!!\n");
            break;
        }
    }
    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值