美文网首页
二叉树遍历的递归和非递归实现

二叉树遍历的递归和非递归实现

作者: 修司敦 | 来源:发表于2018-11-12 09:37 被阅读0次
void preOrderR(const BTreeNode* pRoot)
{
    if (pRoot != nullptr)
    {
        cout << pRoot->value << '\t';
        preOrderR(pRoot->pLeft);
        preOrderR(pRoot->pRight);
    }
}

void inOrderR(const BTreeNode* pRoot)
{
    if (pRoot != nullptr)
    {
        inOrderR(pRoot->pLeft);
        cout << pRoot->value << '\t';
        inOrderR(pRoot->pRight);
    }
}

void postOrderR(const BTreeNode* pRoot)
{
    if (pRoot != nullptr)
    {
        postOrderR(pRoot->pLeft);
        postOrderR(pRoot->pRight);
        cout << pRoot->value << '\t';
    }
}

void preOrder(BTreeNode* pRoot)
{
    if (pRoot == nullptr) return;

    stack<BTreeNode*> nodes;
    BTreeNode* pTempNode = pRoot;
    while (pTempNode != nullptr || !nodes.empty())
    {
        while (pTempNode != nullptr)
        {
            cout << pTempNode->value << '\t';
            nodes.push(pTempNode);
            pTempNode = pTempNode->pLeft;
        }

        if (!nodes.empty())
        {
            pTempNode = nodes.top();
            nodes.pop();
            pTempNode = pTempNode->pRight;
        }
    }
}

void inOrder(BTreeNode* pRoot)
{
    if (pRoot == nullptr) return;

    stack<BTreeNode*> nodes;
    BTreeNode* pTempNode = pRoot;
    while (pTempNode != nullptr || !nodes.empty())
    {
        while (pTempNode != nullptr)
        {
            nodes.push(pTempNode);
            pTempNode = pTempNode->pLeft;
        }

        if (!nodes.empty())
        {
            pTempNode = nodes.top();
            cout << pTempNode->value << '\t';
            nodes.pop();
            pTempNode = pTempNode->pRight;
        }
    }
}

void postOrder(BTreeNode* pRoot)
{
    if (pRoot == nullptr) return;
    stack<BTreeNode*> nodes;
    BTreeNode* pTempNode = pRoot;
    nodes.push(pTempNode);
    BTreeNode* pPastNode = nullptr;

    while(!nodes.empty())
    {
        pTempNode = nodes.top();
        if (// this node is leaf
             (pTempNode->pLeft==nullptr && pTempNode->pRight==nullptr) 
           ||//its children are visited
             (pPastNode!=nullptr && 
               (pPastNode==pTempNode->pLeft || pPastNode==pTempNode->pRight)
             )
           )
        {
            cout << pTempNode->value << '\t';
            nodes.pop();
            pPastNode = pTempNode;
        }
        else
        {
            if (pTempNode->pRight != nullptr)
                nodes.push(pTempNode->pRight);
            if (pTempNode->pLeft != nullptr)
                nodes.push(pTempNode->pLeft);
        }
    }

}

相关文章

  • 总结

    1、二叉树广度遍历(非递归) 广度遍历非递归实现需要依靠一个队列。 2、二叉树深度遍历(递归与非递归,前序,中序和...

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • 二叉树,非递归法

    递归法 二叉树的递归,有前序遍历、中序遍历、后序遍历,一般采用递归法,比较简单 非递归法 二叉树非递归法,采用栈来实现

  • 二叉树的各类遍历方法

    二叉树的遍历主要有四种:前序、中序、后序、层序。 遍历的实现方式主要是:递归和非递归。递归遍历的实现非常容易,非递...

  • 左神算法笔记——Morris遍历

    基本问题——实现二叉树的前序、中序、后序遍历 (递归、非递归,mirros方法) 递归 递归方式下的前中后遍历 非...

  • 数据结构-树的遍历

    1. 先序遍历 递归实现 非递归实现 2. 中序遍历 递归实现 非递归实现 3. 后序遍历 递归实现 非递归实现 ...

  • 二叉树的遍历实现递归与非递归

    本文实现了二叉树的深度遍历算法,分为递归与非递归 递归的实现非常简单,基本上没啥难度 非递归的实现需要根据遍历的顺...

  • Java二叉树的遍历

    Java二叉树的遍历 利用递归和非递归实现二叉树的先序,中序,后序遍历以及使用队列实现二叉树的层次遍历

  • 二叉树遍历java,非递归、层次。

    /** * 前序遍历 * 递归 */ /*** 前序遍历* 非递归*/ 后续遍历非递归 二叉树层次遍历基于java...

  • 二叉树遍历-JAVA实现

    基础二叉树 二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。 前序递归遍历算法:访问根结点-->递归...

网友评论

      本文标题:二叉树遍历的递归和非递归实现

      本文链接:https://www.haomeiwen.com/subject/bnrqfqtx.html