非递归遍历二叉树C语言

非递归遍历二叉树

非递归遍历二叉树通过队列和栈实现。

层序遍历二叉树

/*层序遍历二叉树*/
void LevelOrderTraverse(BinaryTree T)
{
    BinaryTree p = T;
    LinkQueue Q;
    LinkQueue_Init(&Q);
    LinkQueue_Enter(&Q, p);
    while (LinkQueue_Empty(Q) == false)
    {
        p = LinkQueue_Delete(&Q);  //根结点出队
        printf("%c ", p.data);     //访问根结点
        if (p.LChild != NULL)      //左子树不空,入队
        {
            LinkQueue_Enter(&Q, *p.LChild);
        }
        if (p.RChild != NULL)      //右子树不空,入队
        {
            LinkQueue_Enter(&Q, *p.RChild);
        }
    }
    printf("\n");
}

先序遍历二叉树

/*先序遍历二叉树,根——左——右*/
void PreOrderTraverse(BinaryTree T)
{
    BinaryTree* p = &T;
    BinaryTree* q = &T;
    LinkStack S;
    LinkStack_Init(&S);
    while (p != NULL || LinkStack_Empty(S) == false)
    {
        if (p != NULL)
        {
            printf("%c ", p->data);    //访问根结点
            LinkStack_Push(&S, *p);
            p = p->LChild;             //左孩子非空入栈
        }
        else
        {
            *q = LinkStack_Pop(&S);   //根结点出栈
            p = q->RChild;            //右孩子非空入栈  

        }
    }
    printf("\n");
}

中序遍历二叉树

/*中序遍历二叉树,左——根——右*/
void InOrderTraverse(BinaryTree T)
{
    BinaryTree* p = &T;
    BinaryTree* q = &T;
    LinkStack S;
    LinkStack_Init(&S);
    while (p != NULL || LinkStack_Empty(S) == false)
    {
        if (p != NULL)
        {
            LinkStack_Push(&S, *p);
            p = p->LChild;             //左孩子非空入栈
        }
        else
        {
            *q = LinkStack_Pop(&S);    //根结点出栈
            printf("%c ", q->data);    //访问根结点
            p = q->RChild;             //右孩子非空入栈
        }
    }
    printf("\n");
}

后序遍历二叉树

/*后序遍历二叉树,左——右——根*/
void PostOrderTraverse(BinaryTree T)
{
    BinaryTree* p = &T;
    BinaryTree* q = &T;
    LinkStack S,temp;
    LinkStack_Init(&S);
    LinkStack_Init(&temp);
    while (p != NULL || LinkStack_Empty(S) == false)
    {
        if (p != NULL)
        {
//          printf("%c ", p->data);      //访问根结点
//将根——右——左顺序访问的结点存入栈中
            LinkStack_Push(&temp, *p); 
            LinkStack_Push(&S, *p);
            p = p->RChild;              //右孩子非空入栈
        }
        else
        {
            *q = LinkStack_Pop(&S);   //根结点出栈
            p = q->LChild;            //左孩子非空入栈
        }
    }
//遍历栈得到左——右——根顺序的结点
    LinkStack_Traverse(temp);
//销毁暂存栈
    LinkStack_Clear(&temp);
}

测试程序:

int main()
{
    BinaryTree T = { 'A',NULL,NULL };
    BinaryTreeNode NewNode1 = { 'B',NULL,NULL };
    BinaryTreeNode NewNode2 = { 'C',NULL,NULL };
    BinaryTreeNode NewNode3 = { 'D',NULL,NULL };
    BinaryTreeNode NewNode4 = { 'E',NULL,NULL };
    BinaryTreeNode NewNode5 = { 'F',NULL,NULL };
    BinaryTreeNode NewNode6 = { 'G',NULL,NULL };

    T.LChild = &NewNode1;
    T.RChild = &NewNode2;
    NewNode1.LChild = &NewNode3;
    NewNode1.RChild = &NewNode4;
    NewNode2.LChild = &NewNode5;
    NewNode2.RChild = &NewNode6;

    printf("层序遍历:"); 
    LevelOrderTraverse(T);
    printf("前序遍历:"); 
    PreOrderTraverse(T);
    printf("中序遍历:");
    InOrderTraverse(T);
    printf("后序遍历:"); 
    PostOrderTraverse(T);
    //LinkStack_Test();
    //LinkQueue_Test();
    return 0;
}

测试结果:

BinaryTree

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

往昔的恒纳兰那

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

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

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

打赏作者

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

抵扣说明:

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

余额充值