• 先序遍历、中序遍历、后续遍历的非递归遍历,代码已测试


    struct BinaryTreeNode 
    {
        int                    m_nValue; 
        BinaryTreeNode*        m_pLeft;  
        BinaryTreeNode*        m_pRight; 
    };
    
     struct StackNode
    {
        BinaryTreeNode* treeNode;
        bool isRightHasVisited;// 用于标记右子树是否访问过
    };
    
    
    //先序遍历非递归算法
    void PreorderUnrec(BinaryTreeNode* root)
    {
        stack<BinaryTreeNode*> s;
        BinaryTreeNode* p=root;
        while(NULL!=p||!s.empty())
        {
            while(NULL!=p)
            {
                printf("%d  ",p->m_nValue);
                s.push(p);
                p=p->m_pLeft;
            }
            if(!s.empty())
            {
                p=s.top();
                s.pop();
                p=p->m_pRight;
            }
        }
    }
    
    //中序遍历非递归算法
    void InorderUnrec(BinaryTreeNode* root)
    {
        stack<BinaryTreeNode*> s;
        BinaryTreeNode* p=root;
        while(NULL!=p||!s.empty())
        {
            while(NULL!=p)
            {
                s.push(p);
                p=p->m_pLeft;
            }
            if(!s.empty())
            {
                p=s.top();
                s.pop();
                printf("%d  ",p->m_nValue);
                p=p->m_pRight;
            }
        }
    }
    //后序遍历非递归算法
    void PostOrderUnrec(BinaryTreeNode* root)
    {
        stack<StackNode> s;
        StackNode stackNode;
        BinaryTreeNode* p=root;
        do
        {
            while(p!=NULL)
            {
                stackNode.treeNode=p;
                stackNode.isRightHasVisited=false;
                s.push(stackNode);
                p=p->m_pLeft;
            }
            while(!s.empty()&&s.top().isRightHasVisited==true)
            {
                stackNode=s.top();
                s.pop();
                p=stackNode.treeNode;
                printf("%d  ",p->m_nValue);
            }
            if(!s.empty())
            {
                s.top().isRightHasVisited=true;
                p=s.top().treeNode->m_pRight;
            }
        }while(!s.empty());
    }
  • 相关阅读:
    找出水王
    第九周进度表
    [设计模式]组合模式
    [设计模式]外观模式
    [设计模式]策略模式
    [设计模式] 6个设计遵循基本原则
    [OSGI]Eclipse4.2 OSGI依赖Bundle
    [xfire]使用xfire开发webservice的简单示例
    [HTML5 Canvas学习]使用颜色和透明度
    [HTML5 Canvas学习]绘制矩形
  • 原文地址:https://www.cnblogs.com/mangci/p/3224892.html
Copyright © 2020-2023  润新知