二叉树的中序非递归遍历c++版

#include <iostream>
#include <stack>
using namespace std;

//第一种表示方法 :二叉链表示法
typedef struct BiTNode
{
    int data;
    struct BiTNode *lchild,*rchild;
} BiTNode,* BITree;

//中序递归遍历
void inOrder(BiTNode*root)
{
    if (root==NULL)
    {
        return;
    }
    inOrder(root->lchild);
    printf("%d ",root->data);
    inOrder(root->rchild);
}
/*
中序遍历非递归算法:
步骤1:
如果结点有左子树,该结点入栈;
如果结点没有左子树,访问该结点;
步骤2:
如果结点有右子树,重复步骤1;
如果结点没有右子树(结点访问完毕),根据栈顶指示回退,访问栈顶元素,并访问右子树,重复步骤1
如果栈为空,表示遍历结束。*/

//辅助函数 找到中序遍历的起点 
BiTNode* goLeft(BiTNode*t,stack<BiTNode*>&s)
{
    if (t==NULL)
    {
        return NULL;
    }
    //如果结点有左子树,该结点入栈;
    while (t->lchild)
    {
        s.push(t);
        t = t->lchild; 
    }
    return t;
}
//中序遍历非递归 
void inOrder2(BiTNode*root)
{
    stack<BiTNode*> s;
    BiTNode* t ;
    //1.找到中序遍历的起点 (没有左孩子)
    t = goLeft(root,s);
    while (t)
    {
        //访问该元素
        printf("%d ",t->data);
        //2.如果t有右子树 重复步骤1
        if (t->rchild)
        {
            t = goLeft(t->rchild,s);//右子树中序遍历的起点
        }
        //2.如果没有右子树 根据栈顶指示回退
        else if (!s.empty())    
        {
            t = s.top();
            s.pop();
        }
        //3.如果没有右子树且栈为空  表示遍历结束
        else 
        {
            t = NULL;
        }
    }
}
int main()
{
    BiTNode t1,t2,t3,t4,t5,t6;
   
    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));
    memset(&t6,0,sizeof(BiTNode));

    t1.data = 1;
    t2.data = 2;
    t3.data = 3;
    t4.data = 4;
    t5.data = 5;
    t6.data = 6;
    //建立关系 
    t1.lchild = &t2;
    t1.rchild = &t3;
    t2.lchild = &t4;
    t2.rchild = &t5;
    t3.lchild = &t6;

    printf("\n中序递归遍历\n");
    inOrder(&t1);

    printf("\n中序非递归遍历\n");
    inOrder2(&t1);

    system("pause");
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值