二叉树的遍历之非递归算法

利用栈实现,我这里是为了方便用了c++的stack。

定义树的结构体

typedef struct BiTNode{  
    char data;  
    BiTNode *lchild, *rchild;  
}BiTNode,*BiTree;  



先序遍历

先将左子树入栈,边入栈遍输出值,左子树入完后入右子树,再重复之前操作。

</pre><p><pre name="code" class="cpp"><pre name="code" class="cpp"><pre name="code" class="cpp">void PreOrder(BiTree T)     //先序遍历的非递归
{
    if (!T)
    {
        return ;
    }

    stack<BiTree> s;
    while (T)         // 左子树上的节点全部压入到栈中
    {
        s.push(T);
        <pre name = "code" class = "cpp"><span style = "white-space:pre"> < / span > printf("%d ", temp->data);

        T = T->lchild;
    }
    while (!s.empty())
    {
        BiTree temp = s.top()->rchild; 
        {
            printf("%d ", temp->data);
            s.push(temp);
            temp = temp->lchild;
        }
    }
}


 
 

 

中序遍历

先入栈左子树,再输出值,把栈顶的元素提出,访问它的右子树,再重复前面操作。

void InOrderTraverse1(BiTree T)   // 中序遍历的非递归    
{    
    if(!T)    
        return ;    
    BiTree bt = T;    // 指向当前要检查的节点    
    stack<BiTree> s;  
    while(bt != NULL || !s.empty())  
    {  
        while(bt != NULL)  
        {  
            s.push(bt);  
            bt = bt->lchild;  
        } 
        if(!s.empty())  
        {  
            bt = s.top();  
            s.pop();  
            printf("%d ",bt->data;  
            bt = bt->rchild;  
        }  
    }  
}  



后序遍历


void PostOrder_Nonrecursive1(BiTree T)       
{      
    stack<BiTree> S;      
    BiTree curr = T ;           // 指向当前要检查的节点    
    BiTree previsited = NULL;    // 指向前一个被访问的节点    
    while(curr != NULL || !S.empty())  // 栈空时结束      
    {      
        while(curr != NULL)            // 一直向左走直到为空    
        {      
            S.push(curr);      
            curr = curr->lchild;      
        }      
        curr = S.top();    
        // 当前节点的右孩子如果为空或者已经被访问,则访问当前节点    
        if(curr->rchild == NULL || curr->rchild == previsited)      
        {      
            cout<<curr->data<<"  ";      
            previsited = curr;      
            S.pop();      
            curr = NULL;      
        }      
        else    
            curr = curr->rchild;      // 否则访问右孩子    
    }      
} 









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值