二叉树的各种非递归遍历

1.前序非递归:

二叉树的非递归前序遍历,前序遍历思想:先让根进栈,只要栈不为空,就可以做弹出操作,  
每次弹出一个结点,记得把它的左右结点都进栈,记得右子树先进栈,这样可以保证右子树在栈中总处于左子树的下面。  
*/    
void PreOrder_Nonrecursive(BiTree T)     //先序遍历的非递归      
{    
    if(!T)      
        return ;      
      
    stack<BiTree> s;    
    s.push(T);    
    
    while(!s.empty())    
    {    
        BiTree temp = s.top();    
        cout<<temp->data<<" ";    
        s.pop();    
        if(temp->rchild)    
            s.push(temp->rchild);    
        if(temp->lchild)    
            s.push(temp->lchild);    
    }    
}    


2.中序非递归:

  1. void InOrderTraverse(BiTree T)   // 中序遍历的非递归    
  2. {    
  3.     if(!T)    
  4.         return ;    
  5.     stack<BiTree> s;    
  6.     BiTree curr = T->lchild;    // 指向当前要检查的节点    
  7.     s.push(T);    
  8.     while(curr != NULL || !s.empty())    
  9.     {    
  10.         while(curr != NULL)    // 一直向左走    
  11.         {    
  12.             s.push(curr);    
  13.             curr = curr->lchild;    
  14.         }    
  15.         curr = s.top();    
  16.         s.pop();    
  17.         cout<<curr->data<<"  ";    
  18.         curr = curr->rchild;    
  19.     }    
  20. }    
  21.   


3。后序非递归:

  1. void PostOrder_Nonrecursive(BiTree T)  // 后序遍历的非递归     双栈法    
  2. {      
  3.     stack<BiTree> s1 , s2;      
  4.     BiTree curr ;           // 指向当前要检查的节点    
  5.     s1.push(T);    
  6.     while(!s1.empty())  // 栈空时结束      
  7.     {    
  8.         curr = s1.top();    
  9.         s1.pop();    
  10.         s2.push(curr);    
  11.         if(curr->lchild)    
  12.             s1.push(curr->lchild);    
  13.         if(curr->rchild)    
  14.             s1.push(curr->rchild);    
  15.     }    
  16.     while(!s2.empty())    
  17.     {    
  18.         printf("%c ", s2.top()->data);    
  19.         s2.pop();    
  20.     }    
  21. }    


4. 层序遍历

  1. int visit(BiTree T)    
  2. {    
  3.     if(T)    
  4.     {    
  5.         printf("%c ",T->data);    
  6.         return 1;    
  7.     }    
  8.     else    
  9.         return 0;    
  10. }    

  1. void LeverTraverse(BiTree T)   //方法一、非递归层次遍历二叉树     
  2. {    
  3.     queue <BiTree> Q;    
  4.     BiTree p;    
  5.     p = T;    
  6.     if(visit(p)==1)    
  7.         Q.push(p);    
  8.     while(!Q.empty())    
  9.     {    
  10.         p = Q.front();    
  11.         Q.pop();    
  12.         if(visit(p->lchild) == 1)     
  13.             Q.push(p->lchild);    
  14.         if(visit(p->rchild) == 1)    
  15.             Q.push(p->rchild);    
  16.     }    
  17. }    



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值