二叉树的遍历

非递归实现二叉树的遍历

先序遍历

1。先遍历根节点,在把右孩子入栈,在把左孩子入栈(最先入栈的右孩子,最后出栈,最后遍历)
2。如果栈不为空,则出栈,并重复第一步。

void preOrderTraverse(BiTree T){
    InitStack(S);
    Push(S,T);
    BiNode * p;
    while(!StackEmpty(S)){
        Pop(S,p);
        visit(p);
        if(p->rchild!=null) Push(S,p->rchild);
        if(p->lchild!=null) Push(S,p->lchild);
    }
}

中序遍历

1。从根结点向左遍历并全部入栈,直至无左孩子
2。如果栈不为空,出栈并visit结点,
3。若有右子树,则把右子树作为根结点执行第一步。

void putINStack(BiNode *p,Stack S){
    Push(S,p);
    while(p->lchild!=null){
        Push(S,p->lchild);
        p = p->lchild;
    }
}

void InOrderTraverse1(BiNode *p){
    InitStack(S);
    putINStack(p,S);
    BiNode * q;
    while(!StackEmpty(S)){
        Pop(S,q);
        visit(q);
        if(q->rchild!=null) putINStack(q->rchild,S);
    }
}

void InOrderTraverse2( BiNode *x) { //二叉树中序遍历算法(迭代版#2)
   InitStack(S); //辅助栈
   while ( true )
      if ( x ) {
         Push(S,x); //根节点进栈
         x = x->lc; //深入遍历左子树
      } else if ( !StackEmpty() ) {
         Pop(S,x); //尚未访问的最低祖先节点退栈
         visit ( x->data ); //访问该祖先节点
         x = x->rc; //遍历祖先的右子树
      } else
         break; //遍历完成
}

后续遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值