后序遍历非递归算法

时间:2025-04-19 07:28:22

后序遍历

方法一:

//后序遍历
void PostOrderWithoutRecursion(BTNode* root)
{
    if (root == NULL)
        return;
    stack<btnode*> s;
    //pCur:当前访问节点,pLastVisit:上次访问节点
    BTNode* pCur, *pLastVisit;
    //pCur = root;
    pCur = root;
    pLastVisit = NULL;
    //先把pCur移动到左子树最下边
    while (pCur)
    {
        (pCur);
        pCur = pCur->lchild;
    }
    while (!())
    {
        //走到这里,pCur都是空,并已经遍历到左子树底端(看成扩充二叉树,则空,亦是某棵树的左孩子)
        pCur = ();
        ();
        //一个根节点被访问的前提是:无右子树或右子树已被访问过
        if (pCur->rchild == NULL || pCur->rchild == pLastVisit)
        {
            cout << setw(4) << pCur->data;
            //修改最近被访问的节点
            pLastVisit = pCur;
        }
        /*这里的else语句可换成带条件的else if:
        else if (pCur->lchild == pLastVisit)//若左子树刚被访问过,则需先进入右子树(根节点需再次入栈)
        因为:上面的条件没通过就一定是下面的条件满足。仔细想想!
        */
        else
        {
            //根节点再次入栈
            (pCur);
            //进入右子树,且可肯定右子树一定不为空
            pCur = pCur->rchild;
            while (pCur)
            {
                (pCur);
                pCur = pCur->lchild;
            }
        }
    }
    cout << endl;
}</btnode*>

方法二:

public void postOrderWithoutRecursion(TreeNode T){  
          
        Map<Object,Integer> flag = new HashMap<Object,Integer>(); //结点右孩子是否被遍历过的标记  
        Stack<TreeNode> stack = new Stack<TreeNode>();  
        TreeNode p;  
        while(T!=null||!()){  
              
            while(T!=null){  
                (T);  
                (, 0);       //当结点被压入栈时,将value初始化为0  
                T = ;  
            }  
              
            if(!()){  
                p = ();                 
                if(!=null&&()!=1){  
                    T = ;  
                    (, 1);     //表示p结点的右孩子已经被遍历过  
                }else{  
                    ();  
                    ();  
                }                             
            }  
              
        }  
    }