C++ 二叉树的三种遍历 递归与非递归

#include <iostream>
#include <stack>

using namespace std;

struct biTreeNode
{
    int val;
    biTreeNode* left;
    biTreeNode* right;
    biTreeNode(int x) : val(x), left(nullptr), right(nullptr)
    {
    };
};

//递归前序遍历
void recurPreOrderTraversal(biTreeNode* curNode)
{
    if(curNode)
    {
        cout << curNode->val << " ";
        recurPreOrderTraversal(curNode->left);
        recurPreOrderTraversal(curNode->right);
    }
}

//非递归前序遍历
void nonRecurPreOrderTraversal(biTreeNode* curNode)
{
    stack<biTreeNode*> nodeStack;
    biTreeNode* nodePtr = curNode;
    while(nodePtr || !nodeStack.empty())
    {
        while(nodePtr)
        {
            cout << nodePtr->val << " ";
            nodeStack.push(nodePtr);
            nodePtr = nodePtr->left;
        }
        if(!nodeStack.empty())
        {
            nodePtr = nodeStack.top();
            nodeStack.pop();
            nodePtr = nodePtr->right;
        }
    }
}
//递归中序遍历
void recurInOrderTraversal(biTreeNode* curNode)
{
    if(curNode)
    {
        recurInOrderTraversal(curNode->left);
        cout << curNode->val << " ";
        recurInOrderTraversal(curNode->right);
    }
}
//非递归中序遍历
void nonRecurInOrderTraversal(biTreeNode* curNode)
{
    stack<biTreeNode*> nodeStack;
    biTreeNode* nodePtr = curNode;

    while(nodePtr || !nodeStack.empty())
    {
        while(nodePtr)
        {
            nodeStack.push(nodePtr);
            nodePtr = nodePtr->left;
        }
        if(!nodeStack.empty())
        {
            cout << nodeStack.top()->val << " ";
            nodePtr = nodeStack.top();
            nodeStack.pop();
            nodePtr = nodePtr->right;
        }
    }
}
//递归后序遍历
void recurPostOrderTraversal(biTreeNode* curNode)
{
    if(curNode)
    {
        recurPostOrderTraversal(curNode->left);
        recurPostOrderTraversal(curNode->right);
        cout << curNode->val << " ";
    }
}
//非递归后序遍历
void nonRecurPostOrderTraversal(biTreeNode* curNode)
{
    //左右子树颠倒的前序遍历,再翻转
    stack<biTreeNode*> nodeStack;
    stack<int> ans;
    biTreeNode* nodePtr = curNode;

    while(nodePtr || !nodeStack.empty())
    {
        while(nodePtr)
        {
            ans.push(nodePtr->val);
            nodeStack.push(nodePtr);
            nodePtr = nodePtr->right;
        }
        
        if(!nodeStack.empty())
        {
            nodePtr = nodeStack.top();
            nodeStack.pop();
            nodePtr = nodePtr->left;
        }
    }

    //输出
    cout << ans.top();
    ans.pop();
    while(!ans.empty())
    {
        cout << " " << ans.top();
        ans.pop();
    }
}
int main()
{
    auto nodePtr1 = new biTreeNode(1);
    auto nodePtr2 = new biTreeNode(2);
    auto nodePtr3 = new biTreeNode(3);

    nodePtr1->left = nodePtr2;
    nodePtr1->right = nodePtr3;
    nodePtr2->left = new biTreeNode(5);
    nodePtr2->right = new biTreeNode(6);
    nodePtr3->right = new biTreeNode(4);

    biTreeNode* head = nodePtr1;

    //递归、非递归 前序遍历
    recurPreOrderTraversal(head);
    cout << endl;
    nonRecurPreOrderTraversal(head);
    cout << endl;

    //递归、非递归 中序遍历
    recurInOrderTraversal(head);
    cout << endl;
    nonRecurInOrderTraversal(head);
    cout << endl;

    //递归、非递归 后序遍历
    recurPostOrderTraversal(head);
    cout << endl;
    nonRecurPostOrderTraversal(head);
    cout << endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值