美文网首页
树的非递归遍历——后序

树的非递归遍历——后序

作者: eesly_yuan | 来源:发表于2014-10-08 16:25 被阅读42次

后序遍历较为复杂,没有想出来,参考了 二叉树的非递归遍历 原理如下
1、对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。
2、若非上述两种情况,则将P的右孩子和左孩子依次入栈

//后序遍历
void postorder(Node *root)
{
    if (root == NULL)
        return;
    postorder(root->left);
    postorder(root->right);
    cout<<root->val<<" ";
}

//非递归实现
/*对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;
或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。
若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,
左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。*/
void postorderloop(Node *root)
{
    if (root == NULL)
        return;
    stack<Node *> sn;
    Node *cur = NULL;
    Node *pre = NULL;
    sn.push(root);
    while(sn.size())
    {
        cur = sn.top();
        if ((cur->left==NULL&&cur->right==NULL) ||
            (pre!=NULL&&(pre==cur->left||pre==cur->right)))
        {
            cout<<cur->val<<" ";
            sn.pop();
            pre = cur;
        }
        else
        {
            if (cur->right)
                sn.push(cur->right);
            if (cur->left)
                sn.push(cur->left);
        }
    }
}

相关文章

  • goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序

    goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序遍历 层序遍历) 前序遍历 中序遍历 后序遍历 代...

  • 二叉树遍历

    先序遍历——[递归、非递归] 中序遍历——[递归、非递归] 后序遍历——[递归、非递归] 层次遍历——[递归、非递归]

  • 二叉树的遍历

    非递归前序遍历 非递归中序遍历 非递归后序遍历 层序遍历

  • 树的遍历,golang实现

    先序,递归 中序,递归 后序,递归 先序,非递归 中序,非递归 后序,非递归 层序遍历

  • LeetCode 二叉树的后序遍历

    给定一个二叉树,返回它的 后序 遍历。 非递归(迭代): 后序遍历递归定义:先左子树,后右子树,再根节点。 后序遍...

  • 二叉树遍历-JAVA实现

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

  • 二叉树的前中后三种遍历(递归、非递归和Morris)

    前序遍历 递归版本 非递归版本 中序遍历 递归版本 非递归版本 Morris 遍历待补充 后序遍历 递归版本 非递...

  • 二叉树,非递归法

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

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

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

  • 二叉树的遍历算法

    递归版本 先序遍历: 中序遍历: 后序遍历: 非递归版本 先序遍历: 中序遍历: 后序遍历: 层次遍历:

网友评论

      本文标题:树的非递归遍历——后序

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