二叉树的前序/中序/后序/层序的非递归遍历算法

    //前序遍历----非递归
    void PreOrderBinaryTree_Nor()
    {
        if (NULL == _pRoot)
            return;
        cout << "PreOrderBinaryTree_Nor:" << endl;
        stack<BinaryTreeNode<T>*> s;//使用栈
        s.push(_pRoot);
        while (!s.empty())
        {
            BinaryTreeNode<T>* pCur = s.top();
            cout << pCur->_data << " ";
            s.pop();
            if (NULL != pCur->_pRightChild)
                s.push(pCur->_pRightChild);
            if (NULL != pCur->_pLeftChild)
                s.push(pCur->_pLeftChild);
        }
        cout << endl;
    }
    //中序遍历----非递归
    void InOrderBinaryTree_Nor()
    {
        if (NULL == _pRoot)
            return;
        cout << "InOrderBinaryTree_Nor:" << endl;
        stack<BinaryTreeNode<T>*> s;//使用栈
        BinaryTreeNode<T>* pCur = _pRoot;
        while (pCur || !s.empty())
        {
            //找最左边的结点
            while(pCur)
            {
                s.push(pCur);
                pCur = pCur->_pLeftChild;
            }
            BinaryTreeNode<T>* pTop = s.top();
            cout << pTop->_data << " ";
            s.pop();
            pCur = pTop->_pRightChild;
        }
        cout << endl;
    }
    //后序遍历----非递归
    void PostOrderBinaryTree_Nor()
    {
        if (NULL == _pRoot)
            return;
        cout << "PostOrderBinaryTree_Nor:" << endl;
        stack<BinaryTreeNode<T>*> s;//使用栈
        BinaryTreeNode<T>* pCur = _pRoot;
        BinaryTreeNode<T>* prev = NULL;//保存最近访问的结点
        while (pCur || !s.empty())
        {
            while (pCur)
            {
                s.push(pCur);
                pCur = pCur->_pLeftChild;
            }
            BinaryTreeNode<T>* pTop;
            pTop = s.top();
            if (NULL == pTop->_pRightChild || pTop->_pRightChild == prev)
            {
                cout << pTop->_data<<" ";
                prev = pTop;
                s.pop();
            }
            else
            {
                pCur = pTop->_pRightChild;
            }
        }
        cout << endl;
    }
    //层序遍历
    void LevelOrderBinaryTree()
    {
        if (NULL == _pRoot)
            return;
        cout << "LevelOrderBinaryTree:" << endl;
        queue<BinaryTreeNode<T>*> q;//借助队列
        q.push(_pRoot);
        while (!q.empty())
        {
            BinaryTreeNode<T>* pCur = q.front();
            cout << pCur->_data << " ";
            if (NULL != pCur->_pLeftChild)
                q.push(pCur->_pLeftChild);
            if (NULL != pCur->_pRightChild)
                q.push(pCur->_pRightChild);
            q.pop();
        }
        cout << endl;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值