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());
    }
  • 相关阅读:
    字符串处理类
    PageHelper
    JavaScriptPlus操作类
    Http 数据操作
    解压 压缩 C#
    验证码生成 C#
    MySecurity(安全类)
    博客搬迁至wordpress站点
    我的前端MVC之路
    三个css3趣玩小试
  • 原文地址:https://www.cnblogs.com/mangci/p/3224892.html
Copyright © 2011-2022 走看看