二叉树的遍历(非递归方式)

Posted single-dont

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的遍历(非递归方式)相关的知识,希望对你有一定的参考价值。

前序非递归遍历(借用栈结构):
①将根节点入栈;
②判栈空,获取栈顶元素输出;
③判断右子树是否为空,再判断左子树是否为空,在回至②执行。
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赋为空,这样下次大循环中的第一个循环被掠过,相当于返回了上一层 
        
        

以上是关于二叉树的遍历(非递归方式)的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的遍历--递归实现与非递归实现

二叉树的遍历(基于栈的非递归方式实现)

二叉树的非递归遍历

二叉树的三种非递归遍历方式(附Cjava源码)

Java实现二叉树的创建递归/非递归遍历

二叉树的前中后序遍历(非递归实现)