Mike 发表于 2021-7-11 11:47:53

二叉树的建立先及二叉树的先序、中序、后序遍历

  运行结果:
  建立:

  先序:

  后续:

  中序:

  完整代码:
  #define  _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
using namespace std;
#define OVERFLOW -2
  
//二叉树的二叉链表存储表示
typedef struct BiTNode{
    char data;
    struct BiTNode *lchild, *rchild;//左右孩子指针
}BiTNode,*BiTree;
  BiTNode* CreateTree(BiTNode *&T);//创建二叉树
void PreOrder(BiTNode *T);//先序遍历
void PostOrder(BiTNode *T);//后序遍历
void InOrder(BiTNode *T);//中序遍历
  int main()
{
    BiTNode *T = NULL;
    char ch1, ch2;
    ch1 = 'y';
    while (ch1 == 'y')
    {
        cout << "-----------二叉树------------" << endl;
        cout << "-------1.创建二叉树    ------" << endl;
        cout << "-------2.先序遍历二叉树------" << endl;
        cout << "-------3.后序遍历二叉树------" << endl;
        cout << "-------4.中序遍历二叉树------" << endl;
        cout << "-------0.返回          ------" << endl;
        cout << "-------请选择菜单号    ------" << endl;
        cin >> ch2;
        getchar();
        cout << endl;
        switch (ch2)
        {
        case'1':
            cout << "请输入按先序创建二叉树的结点序列(#表示结点为空):";
            CreateTree(T);
            cout << "二叉树创建成功"<<endl;
            break;
        case'2':
            cout << "该二叉树的先序遍历为:" << endl;
            PreOrder(T);
            cout << endl;
            break;
        case'3':
            cout << "该二叉树的后序遍历为:" << endl;
            PostOrder(T);
            cout << endl;
            break;
        case'4':
            cout << "该二叉树的中序遍历为:" << endl;
            InOrder(T);
            cout << endl;
            break;
        case'0':
            ch1 = 'n';
            break;
        default:
            cout << "输入有误" << endl;
        }//switch
    }//while
    return 0;
}
  BiTNode* CreateTree(BiTNode *&T)//创建
{
    char ch;
    scanf("%c", &ch);
    if (ch == '#')
        T = NULL;
    else
    {
        if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))
            exit(OVERFLOW);
        T->data = ch;//生成根节点
        T->lchild=CreateTree(T->lchild);//构建左子树
        T->rchild = CreateTree(T->rchild);//构建右子树
    }
    return T;
}
  void PreOrder(BiTNode *T)//先序遍历
{
    if (T)
    {
        cout << T->data;//访问根节点
        PreOrder(T->lchild);//左子树
        PreOrder(T->rchild);//右子树
    }
}
void PostOrder(BiTNode *T)//后序遍历
{
    if (T)
    {
        PostOrder(T->lchild);//左子树
        PostOrder(T->rchild);//右子树
        cout << T->data;//访问根
    }
}
void InOrder(BiTNode *T)//中序遍历
{
    if (T)
    {
        PostOrder(T->lchild);//左子树
        cout << T->data;//访问根
        PostOrder(T->rchild);//右子树
    }
}
  二叉树的创建以及遍历都是使用递归的思想来进行的

  
文档来源:51CTO技术博客https://blog.51cto.com/u_15098794/3035591
页: [1]
查看完整版本: 二叉树的建立先及二叉树的先序、中序、后序遍历