树 中序遍历非递归算法

文章目录

算法

左子树为空或者左子树已经访问完毕后,再访问根 访问根完毕后 再访问右子树
栈结构 符合先入后出
步骤一:结点有左子树 结点入栈;结点没有左子树 访问该结点
步骤二:结点有右子树 重复步骤一;结点没有右子树 结点访问完毕 根据栈顶指示回退 访问栈顶元素 并 访问右子树
重复步骤一
栈为空则遍历结束

结点入栈表明 本身没被访问 自身的右子树也没有被访问

代码

typedef struct BiTNode* BiTree;

void inOrder(BiTNode * root)
{
    if(root == NULL)
    {
        return ;
    }
    //遍历左子树
    inOrder(root->lchild);
    //遍历右子树
    inOrder(root->rchild);
}

BiTNode * goLeft(BiTNode * T,stack<BiTNode*> &s)
{
    if(T = NULL)
    {
        return NULL;
    }
    while(T->lchild !=NULL)
    {
        s.push(T);
        T = T->lchild;
    }
    return T;
}

void Inorder2(BiTnode *T)
{
    BiTNode t=NULL;
    stack<BiTnode *> s;

    t = goLeft(T,s);

    while(t)
    {
        cout<<t->data;
        if(t->rchild !=NULL)
        {
            t = goLeft(t->rchild,s);//右子树中序遍历起点
        }
        else if(!s.empty())
        {
            t = s.top();
            s.pop();
        }
        else //没有右子树 栈为空
        {
            t= NULL;
        }
    }
}

void main()
{
    BiTNode t1,t2,t3,t4,t5;
    memset(&t1,0,sizeof(BiTNode);
    memset(&t2,0,sizeof(BiTNode);
    memset(&t3,0,sizeof(BiTNode);
    memset(&t4,0,sizeof(BiTNode);
    memset(&t5,0,sizeof(BiTNode);

    t1.lchild = &t2;
     t1.rchild = &t3;
      t2.lchild = &t4;
       t3.lchild = &t5;

    inOrder(&t1);
    inOrder2(&t1);
    system("pause");
    return ;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

。✧* ꧁流痕꧂✧*。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值