小白都能看懂的二叉树基本操作(二):前序遍历、中序遍历、后序遍历

前言:

       二叉树的基本遍历方式有三种,分别是前序遍历、中序遍历和后序遍历。

        前序遍历,是指父节点在前,左子树其次,右子树在后的遍历方式。

        中序遍历,是指左子树在前,父节点其次,右子树在后的遍历方式。

        后序遍历,是指左子树在前,右子树其次,父节点在后的遍历方式。

        不用死记硬背,都以父节点做基准,其次左子树永远在右子树前。前序遍历为“父->左->右”,中序遍历为“左->父->右”,后序遍历为“左->右->父”。

示例:

图片

       以上图为例,其三序遍历结果如下:

       前序遍历:a -> b -> c -> d -> e -> f -> g -> h

       中序遍历:b -> c -> d -> e -> f -> a -> g -> h

       后序遍历:b -> c -> d -> e -> f -> g -> h -> a

实现:

       因为每个子树的遍历方式以及遍历效果相同,因此采用递归方式,实现非常简单:

建树的代码可以参考之前文章:

建树操作

       前序遍历的实现:

//前序遍历
void PreOrder(Node *pTree)
{
    if(pTree == NULL)
        return ;
    
    cout << pTree->data << " -> ";
    PreOrder(pTree->left);
    PreOrder(pTree->right);
}

      中序遍历:

//中序遍历
void MiddleOrder(Node *pTree)
{
    if(pTree == NULL)
        return ;
    
    PreOrder(pTree->left);
    cout << pTree->data << " -> ";
    PreOrder(pTree->right);
}

         后序遍历:


//后序遍历
void LastOrder(Node *pTree)
{
    if(pTree == NULL)
        return ;
    
    PreOrder(pTree->left);
    PreOrder(pTree->right);
    cout << pTree->data << " -> ";
}

源码:


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



struct Node 
{
    char data;
    Node *left;
    Node *right;
};
Node *Create(char **str)
{
    Node *s = NULL;
    if(str != NULL && *str != NULL && **str != '#')
    {   
        s = new Node;
        s->data = **str;
        s->left = Create(&++*str);
        s->right = Create(&++*str);
    }   
    return s;
}

//前序遍历
void PreOrder(Node *pTree)
{
    if(pTree == NULL)
        return ;
    
    cout << pTree->data << " -> ";
    PreOrder(pTree->left);
    PreOrder(pTree->right);
}
//中序遍历
void MiddleOrder(Node *pTree)
{
    if(pTree == NULL)
        return ;
    
    PreOrder(pTree->left);
    cout << pTree->data << " -> ";
    PreOrder(pTree->right);
}
//后序遍历
void LastOrder(Node *pTree)
{
    if(pTree == NULL)
        return ;
    
    PreOrder(pTree->left);
    PreOrder(pTree->right);
    cout << pTree->data << " -> ";
}

int main()
{
    char *str = "abc##de##f##g#h##";
    Node *p = Create(&str);
    PreOrder(p);
    cout << endl;
    MiddleOrder(p);
    cout << endl;
    LastOrder(p);
    cout << endl;
}

欢迎关注我的个人公众号【头发头发等等我】

验证:

       运行截图:

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值