二叉树的周游方法(2)

//后跟次序周游 非递归
//同一二叉树可能先后两次进栈
//设置标志
typedef struct{
int tag;
BinTree t;
}Elem;

void nPostOrder1(BinTree t)
{
  Stack s;
  Elem stnode;
  BinTreeNode *p = t;
  if(t == NULL) return ;
  s = createEmptyStack();
  do{
    while(p!=NULL){
      stnode.t = p;
      stnode.tag = 1;
      push(s,stnode);
      p = leftChild(p); //左节点一直进栈
    }
  while(!isEmptyStack(s)){
    stnode = top(s);
    pop(s); //弹栈
    p = stnode.t;
    if(stnode.tag == 1) //是第一次进栈
    {
      stnode.tag = 2; //第二次进栈
      push(s,stnode); 
      p = rightChild(p); //周游其右节点
      break; //退出本次循环
    }
    else visit(root(p)); //周游其根节点
    } 
  }while(!isEmptyStack(s));
}

修改

void nPostOrder2(BinTree t)
{
  Stack  s = createEmptyStack();
  BinTree p = t;
  while(p!=NULL || !isEmptyStack(s))
  {
    while(p!=NUL){
      push(s,p);
      p = leftChild(p)?leftChild(p):rightChild(p); //
    }
    p = top(s)
    pop(s);
    visit(root(p)); //栈顶为访问节点
    if(!isEmptyStack(s) && leftChild(top(s)) == p){ //栈非空且从左子树退回
      p = rightChild(top(s)); 
    else p=NULL; //从右子树回来 推到上一层处理
    }
  }
}

广度优先周游

void levelOrder(BinTree t)
{
  BinTree c,cc;
  Queue q = createNullQueue();
  if (t == NULL) {
    /* code */
    return ;
    c=t;
    enQueue(q,c); // 树根先入队
    while(!isEmptyStack(q))
      {
        c = frontQueue(q); deQueue(q); visit(root(c)); //队首出队,并访问
        c = leftChild(c); if(cc!=NULL) enQueue(q,cc); //将左子树送入队列
        cc = rightChild(c); if(cc!=NULL) enQueue(q,cc); //右子树入队
      }
  }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值