zoukankan      html  css  js  c++  java
  • 二叉树的遍历(非递归方式)

    前序非递归遍历(借用栈结构):
    ①将根节点入栈;
    ②判栈空,获取栈顶元素输出;
    ③判断右子树是否为空,再判断左子树是否为空,在回至②执行。
    void PreOrder(BinTree bt)
    {
        stack<BinTree> astack;
        BinTreeNode * p;
        astack.push(bt);
        while(!astack.empty())
        {
            p=astack.top();
            astack.pop();
            cout<<p->data<<" ";
            if(p->rightchild!=NULL)
            {
                astack.push(p->rightchild);
            }
            if(p->leftchild!=NULL)
            {
                astack.push(p->leftchild);
            }
        }
    }
    中序非递归遍历(借用栈结构):
    先将根节点入栈
    ①首先保存当前结点所有的左树结点;
    ②当左树为空时,获取栈顶元素(最左子树)输出val;
    ③再访问栈顶元素的右子树(p=p->right),再回退到①。
    void InOrder(BinTree bt)
    {
        stack<BinTree> astack;
        BinTree p;
        p=bt;
        if(p==NULL)
        {
            return;
        }
        astack.push(bt);
        p=p->leftchild;
        while(p||!astack.empty())
        {
            while(p!=NULL)//沿着左支深入直至NULL 
            {
                astack.push(p);
                p=p->leftchild;
            }
            
            p=astack.top();//逐个弹出,访问 
            astack.pop();
            cout<<p->data<<" "; 
            p=p->rightchild;//进入右支,下次的大循环,就在右支中向左深入 
        }
    }
    后序非递归遍历(借用栈结构):
    ①判断当前结点不为空,并且栈不空,然后将根节点左子树所有节点压栈。
    ②获取栈顶元素并pop(),判断一下此时的栈顶元素的左子树,是否是上一次pop出的元素(即“/”型,表示当前栈顶元素的右子树还未遍历,故又以当前栈顶元素的右子树作为根节点),继续执行①;若不满足,则将其至NULL。
    void PostOrder(BinTree bt) 
    {
        BinTree p=bt;
        stack<BinTree> astack;
        if(bt==NULL)
        {
            return ;
        }
        
        while(p!=NULL||!astack.empty())
        {
            while(p!=NULL)
            {
                astack.push(p);
                p=p->leftchild?p->leftchild:p->rightchild;//如果左孩子非空,移向左孩子,否则移向右孩子 
            }
            //此处已到达最底层 
            p=astack.top();
            astack.pop();
            cout<<p->data<<" ";
            
            if(!astack.empty()&&(astack.top()->leftchild==p))//如果栈非空,并且刚刚访问的节点是左孩子 
            {
                p=astack.top()->rightchild;//移向右孩子,下次大循环就开始寻找这个节点最底层 
            }
            else//如果是右孩子,说明左孩子在上次就被处理 
            {
                p=NULL;//p赋为空,这样下次大循环中的第一个循环被掠过,相当于返回了上一层 
            }
        }    
    }
  • 相关阅读:
    NTDDI_VERSION,_WIN32_WINNT,WINVER,_WIN32_IE
    SOL_SOCKET, SO_KEEPALIVE
    荣幸的一天
    值得思考的一些东西
    一个flash前后台开源框架的的站点
    30个AS3开源项目
    [算法] doj 1066 最长上升子序列
    [算法] doj 1605 Common Subsequence 公共子序列
    华为EC321CDMA PCMICA 无线网卡Ubuntu下使用
    my_judged.cc 的初稿
  • 原文地址:https://www.cnblogs.com/single-dont/p/11545226.html
Copyright © 2011-2022 走看看