数的非递归前序遍历

template <class * >
void PreOrder_2(BinTreeNode *p)   //非递归前序遍历 
 {  
    stack < * > S;  
 while(p!=NULL || !S.empty())  
 {   
 while(p!=NULL)
   {  
        cout<<p->data;    //访问根结点   
        S.push(p);
        p=p->leftChild;   //遍历指针进到左子女结点   
   
  if(!S.empty())          //栈不空时退栈   
  {      p=S.top(); 
         S.pop();
         p = p->rightChild;     //遍历指针进到右子女结点   
   
 }  
}
template<class * >
void InOrder_2(BinTreeNode *p)   //非递归中序遍历 
{  stack* > S; 
 do{ 
 while(p!=NULL)             //遍历指针未到最左下的结点,不空   
   {    
           S.push(p);       
           p=p->leftChild;        
   }   
  if(!S.empty())             //栈不空时退栈  
   {    p=S.top(); 
        S.pop();              
        cout<<p->data;            
        p=p->rightChild;          
   
 }  while(p !=NULL || !S.empty());
 }
template 
void PostOrder_2(BinTreeNode *p)  //非递归后序遍历 
  stack * > S;  
  stack tag;//定义一个新的栈用来保存tag域判别根结点的左右子树是否均遍历过  
while(p != NULL || !S.empty())            //左子树经过结点加L进栈   
   while(p!=NULL)  
  {      S.push(p); //首先将t和tag为0入栈,遍历左子树       
         tag.push(0);//遍历左子树前的现场保护   
         p=p->leftChild;   
  }    
while( !S.empty() && tag.top()==1)  
  {   
    p=S.top();   
    S.pop();   
    tag.pop();  
    cout<<p->data; //最后访问根结点。  
  }   
 if( !S.empty())  
  {   
   tag.pop();  
   tag.push(1);//遍历右子树前的现场保护,修改栈顶tag为1,遍历右子树  
   p=S.top();    // 取栈顶保存的指针  
   p=p->rightChild;   
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值