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

Posted hi3254014978

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的中序和后序遍历的非递归实现相关的知识,希望对你有一定的参考价值。

遍历一棵二叉树常用的有四种方法,前序(PreOrder)、中序(InOrder)、后序(PastOrder)还有层序(LevelOrder)。
前中后序三种遍历方式都是以根节点相对于它的左右孩子的访问顺序定义的。例如根->左->右便是前序遍历,左->根->右便是中序遍历,左->右->根便是后序遍历。
而层序遍历是一层一层来遍历的。

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

先序遍历:

先序遍历时,每当我们压入一个结点,我们压入结点前对其进行访问。

    void preOrder(TreeNode* pRoot, int k)
    {
        stack<TreeNode*> S;
        TreeNode* cur = pRoot;
        while(cur || !S.empty()){
            while(cur){
                S.push(cur);
                cout << cur->value << " ";
                cur = cur->left;
            }
            // 访问根节点
            cur = S.top();
            S.pop();
            cur = cur.right;
        }
    }                

 

中序遍历:

中序时我们需要在遍历完左子树后访问根节点,再去遍历右子树,因此我们仅需依照先序遍历修改部分代码。

    // 中序遍历
    // 如果存在左子树不断压栈,遍历根节点,遍历右子树
    void inOrder(TreeNode* pRoot, int k)
    {
        stack<TreeNode*> S;
        TreeNode* cur = pRoot;
        while(cur || !S.empty()){
            while(cur){
                S.push(cur);
                cur = cur->left;
            }
            // 访问根节点
            cur = S.top();
            S.pop();
            cout << cur->value << " ";
            cur = cur.right;
        }
    }

 

以上是关于二叉树的中序和后序遍历的非递归实现的主要内容,如果未能解决你的问题,请参考以下文章

创建二叉树非递归完成对二叉树的先序和后序遍历并遍历输出每一层的结点数查找结点P 和结点Q的最近共同祖先

二叉树的前序中序和后续遍历及应用场景

构造一棵二叉树,并分别输出其先序遍历、中序遍历和后序遍历的结果

已知二叉树的中序序列和后序序列,怎么求前序序列

二叉树前序中序和后序的非递归遍历

二叉树的非递归遍历(先序中序后序和层序遍历)