二叉树的前序、中序和后序遍历

目录

文章目录


前言

例如:跟着其他的大神学习了二叉树的遍历,下面简单介绍一下二叉树遍历的知识。

(我是一个纯小白)


一、二叉树遍历是什么?

所谓遍历,就是将一个数据结构中的数据按照一定的顺序都过一遍。而二叉树的遍历,就是按照一定规律依次遍历二叉树中的根节点、左子树、右子树。

二、二叉树遍历的种类

若规定遍历先左后右,那么二叉树的遍历种类可分为前序遍历、中序遍历、后序遍历。前序遍历的遍历方式为访问根节点,访问左子树,访问右子树(顺序即为根左右)。中序遍历的遍历方式为访问左子树,访问根节点,访问右子树(顺序为左根右)。后序遍历的遍历方式为访问左子树,访问右子树,访问根节点(顺序为左右根)。根在哪就如何遍历,根在前为前序,在中为中序,在后为后序。

以下遍历的实现是基于递归算法。

1.前序遍历

代码如下(示例):

void Preordertraverse(Binode *T){//通过递归来实现遍历
    if(T){//如果根节点不为空
        cout<<T->data<<" ";//输出根节点的数据
        Preordertraverse(T->Lchild);//以左子树为根节点递归
        Preordertraverse(T->rchild);//以右子树为根节点递归
    }
}

2.中序遍历

代码如下(示例):

//2、中序遍历
void Inordertraverse(Binode *T)
{
    if(T)//判断根节点是否为空
    {
        Inordertraverse(T->Lchild);//以左子树为根节点递归
        cout<<T->data<<" ";//输出根节点的数据
        Inordertraverse(T->rchild);//以右子树为根节点递归
    }
}

3、后序遍历

代码如下(示例):

void Postordertraverse(Binode *T)
{
    if(T)//判空
    {
        Inordertraverse(T->Lchild);//以左子树为根节点递归
        Inordertraverse(T->rchild);//以右子树为根节点递归
        cout<<T->data<<" ";//输出根节点的数据
    }
}

遍历如下二叉树(可以说是最简单的二叉树了,嘿嘿)

 

完整调试代码如下:

#include <iostream>
#include<stdlib.h>
using namespace std;
//二叉链表的结构定义
typedef struct Binode{
 char data;//定义数据存放点
struct Binode *Lchild,*rchild;//分别定义左子树和右子树
}Binode,*Bitree;//定义数据结构别名
//1.先序遍历
void Preordertraverse(Binode *T){
    if(T){
        cout<<T->data<<" ";
        Preordertraverse(T->Lchild);
        Preordertraverse(T->rchild);
    }
}
//2、中序遍历
void Inordertraverse(Binode *T)
{
    if(T)
    {
        Inordertraverse(T->Lchild);
        cout<<T->data<<" ";
        Inordertraverse(T->rchild);
    }
}
//3.后序遍历
void Postordertraverse(Binode *T)
{
    if(T)
    {
        Inordertraverse(T->Lchild);
        Inordertraverse(T->rchild);
        cout<<T->data<<" ";
    }
}
int main()
{
    Binode *T;
    //二叉树的初始化
    T=(Binode *)malloc(sizeof(Binode));//利用malloc函数为二叉树根节点分配空间
    T->data='a';//二叉树根节点赋值
    T->Lchild=(Binode *)malloc(sizeof(Binode));//利用malloc函数为二叉树左子树分配空间
    T->Lchild->data='b';//二叉树左子树赋值
    T->Lchild->Lchild=NULL;//左子树无孩子
    T->Lchild->rchild=NULL;
    T->rchild=(Binode *)malloc(sizeof(Binode));//利用malloc函数为二叉树右子树分配空间
    T->rchild->data='c';//为二叉树右子树赋值
    T->rchild->Lchild=NULL;//右子树无孩子
    T->rchild->rchild=NULL;
    //前序遍历
    cout<<"前序遍历结果如下:"<<endl;
    Preordertraverse(T);//调用前序遍历函数
    cout<<endl;//换行
    //中序遍历
    cout<<"中序遍历结果如下:"<<endl;
     Inordertraverse(T);//调用中序遍历函数
     cout<<endl;
    //后序遍历
    cout<<"后序遍历结果如下:"<<endl;
    Postordertraverse(T);//调用后序遍历函数
    cout<<endl;
    return 0;
}


总结

代码很简单吧,哈哈哈。适合初学者看,我也是小白,能力有限,写不出太复杂的代码。

二叉树其实重在理解,理解之后就好学多了。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值