zoukankan      html  css  js  c++  java
  • 先序遍历、中序遍历、后续遍历的非递归遍历,代码已测试

    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());
    }
  • 相关阅读:
    Maven私服安装
    Maven运行的方式
    Maven传递依赖的范围
    Maven子模块
    Maven父工程
    Maven项目指定JDK版本
    Maven传递依懒
    Maven概念模型
    Swift -欢迎界面1页, 延长启动图片的显示时间(LaunchImage)
    Swift
  • 原文地址:https://www.cnblogs.com/mangci/p/3224892.html
Copyright © 2011-2022 走看看