二叉树的三种遍历递归法和非递归法(前序、中序、后续)

本文详细介绍了二叉树的三种遍历方式:前序、中序和后序遍历,并提供了递归与非递归两种实现方法的代码示例。

二叉树的前序遍历:根->左->右

1、递归方法:

思路:我们知道递归就是将一个大问题不断分成子问题进行处理,当达到递归终止条件时,跳出。因此在前序遍历中我们把每一个节点分成三部分,即:根节点、左子树、右子树。

例如下面这个二叉树递归过程:

这里写图片描述

转化成代码代码:

void PrevOrder()     //1、递归法    
{
    Node* root = _Root;
    _PrevOrder(root);
}
void _PrevOrder(Node* root)
{
    if (root)
    {
        cout<<root->_Data<<endl;
        _PrevOrder(root->_Left);
        _PrevOrder(root->_Right);
    }
}

2、非递归法

思路:不用递归去遍历,我们如何获得上个节点的信息呢??这里,我们可以建立一个栈,这个栈用于保存每次化成子问题的根结点。

例如下面这个二叉树非递归过程:

这里写图片描述

代码:

void PrevOrderNonR()  //2、非递归法(利用栈的思想)
{
    Node* cur = _Root;
    stack<Node*> s;
    while (!s.empty() || cur)
    {
        while(cur)
        {
            cout<<cur->_Data<<"  ";
            s.push(cur);
            cur = cur->_Left;
        }
        Node* top =  s.top();
        s.pop();
        cur = top->_Right;
    }
} 

二叉树的中序遍历:左->根->右

1、递归方法:

void InOrder()   //中序递归遍历
{
    _InOrder(_root);
    cout << endl;
}
void _InOrder(Node* root)
{
    if (root != NULL)
    {
        _InOrder(root->_left);
        cout << root->_data << "  ";
        _InOrder(root->_right);
    }
}

2、非递归方法:

void InOrderNoR() //中序非递归遍历
    {
        stack<Node*> s;
        Node* cur = _root;
        while (cur ||  !s.empty())
        {
            while (cur)
            {
                s.push(cur);
                cur = cur->_left;
            }
            Node* top = s.top();
            cout << top->_data << "  ";
            s.pop();
            cur = top->_right;
        }
        cout << endl;
    }

二叉树的后序遍历:左->右->根

1、递归方法:

    void PostOrder() //后续递归
{
    _PostOrder(_root);
    cout << endl;
}
    void _PostOrder(Node* root)
{
    if (root != NULL)
    {
        _PostOrder(root->_left);
        _PostOrder(root->_right);
        cout << root->_data << "  ";
    }
}

2、非递归方法:

void PostOrderNoR() //后续非递归
{
    stack<Node*> s;
    Node* cur = _root;
    Node* prev = NULL;
    while (cur || !s.empty())
    {
        while (cur)
        {
            s.push(cur);
            cur = cur->_left;
        }
        Node* top = s.top();
        if (top->_right == NULL || top->_right == prev)
        {
            cout << top->_data << "  ";
            prev = top;
            s.pop();
        }
        else
        {
            cur = top->_right;
        }
    }
    cout << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值