数据结构学习【二叉树 链式结构 C++ 先序&中序&后序&层次遍历】

数据结构学习【二叉树 链式结构 C++ 先后中序和层次遍历】

本次实现的是二叉树的链式存储结构。插入方式采用的是二叉排序树的插入方式。实现了二叉树的先序&中序&后序&层次遍历

#include <iostream>
#include <queue>
using namespace std;

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

bool Insert(BiTree &root, int data);     // 根据二叉排序树插入
void Traversal(BiTNode *root, int type); // 0: 先序, 1: 中序, 2: 后序, 3: 层次
void PreorderTraversal(BiTNode *root);
void InorderTraversal(BiTNode *root);
void PostorderTraversal(BiTNode *root);
void LevelTraversal(BiTNode *root);
void visit(BiTNode* p);//访问结点
// Code

int main()
{
    
    
    BiTree root = nullptr;
    Insert(root, 6);
    Insert(root, 4);
    Insert(root, 5);
    Insert(root, 8);
    Insert(root, 7);
    Insert(root, 9);

    printf("二叉排序树");
    printf("\n先序:");
    Traversal(root,0);
    printf("\n中序:");
    Traversal(root,1);
    printf("\n后序:");
    Traversal(root,2);
    printf("\n层次:");
    Traversal(root,3);
    system("pause");
}
// 根据二叉排序树插入
bool Insert(BiTree &p, int data)
{
    
    
    if (p == nullptr)
    {
    
    
        p = (BiTNode *)malloc(sizeof(BiTNode));
        p->data = data;
        p->lchild = nullptr;
        p->rchild = nullptr;
        return true;
    }
    if (data < p->data)
    {
    
    
        Insert(p->lchild, data);
        return true;
    }
    else if (data > p->data)
    {
    
    
        Insert(p->rchild, data);
        return true;
    }
    else
    {
    
    
        return false;
    }
}
// 0: 先序, 1: 中序, 2: 后序, 3: 层次
void Traversal(BiTNode *root, int type)
{
    
    
    switch (type)
    {
    
    
    case 0:
        PreorderTraversal(root);
        break;
    case 1:
        InorderTraversal(root);
        break;
    case 2:
        PostorderTraversal(root);
        break;
    case 3:
        LevelTraversal(root);
        break;
    default:
        break;
    }
}
//先序
void PreorderTraversal(BiTNode *root){
    
    
   if(root!=nullptr){
    
    
        visit(root);
        PreorderTraversal(root->lchild);
        PreorderTraversal(root->rchild);
    }
}
void InorderTraversal(BiTNode *root){
    
    
    if(root!=nullptr){
    
    
        InorderTraversal(root->lchild);
        visit(root);
        InorderTraversal(root->rchild);
    }
}
void PostorderTraversal(BiTNode *root){
    
    
    if(root!=nullptr){
    
    
        PostorderTraversal(root->lchild);
        PostorderTraversal(root->rchild);
        visit(root);
    }
}
void LevelTraversal(BiTNode *root){
    
    
    queue<BiTNode*> Q;
    Q.push(root);
    while (!Q.empty())
    {
    
    
        if(Q.front()->lchild!=nullptr)
            Q.push(Q.front()->lchild);
        if(Q.front()->rchild!=nullptr)
            Q.push(Q.front()->rchild);
        visit(Q.front());
        Q.pop();
    }
    
}
//访问结点
void visit(BiTNode* p){
    
    
    printf("%d ",p->data);
}

本文插入数据形成的二叉树如图
在这里插入图片描述
对应的遍历顺序
先序:6 4 5 8 7 9
中序:4 5 6 7 8 9
后序:5 4 7 9 8 6
层次:6 4 8 5 7 9

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

猜你喜欢

转载自blog.csdn.net/toro180/article/details/122563253