二叉树的周游方法(2)

本文详细介绍了二叉树的非递归后序遍历算法,包括使用栈进行节点标记和二次遍历的方法,以及广度优先遍历的实现过程。通过具体的代码示例,深入解析了每种遍历方式的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//后跟次序周游 非递归
//同一二叉树可能先后两次进栈
//设置标志
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); //右子树入队
      }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值