数据结构——二叉树遍历(非递归)

前序遍历非递归算法:

二叉树前序遍历的非递归算法的关键:在前序遍历完某结点的整个左子树后,如何找到该结点的右子树的根指针。
解决办法:在访问完该结点后,将该结点的指针保存在栈中,以便以后能通过它找到该结点的右子树。

前序遍历非递归原理图:

1、边访问边进栈

2、左子树为空时,出栈,结点返回,转向右子树

当栈为空且p=NULL时,前序遍历完毕

伪代码:

void preorder(BiNode *bt)

{

    linklist_t *s = linkstack_init();

    BiNode *p=bt;

    while (p!=NULL&&linkstack_isempty(s)!=1)

    {

        while(p!=NULL)

        {

            printf("%d ",p->data);

            linkstack_push (s,p->data);

            p=p->lchild;

        }

        if(linkstack_isempty(s)!=1)

        {

            p=linkstack_pop (s);

            p=p->rchild;

        }

    }

}

中序遍历非递归算法

原理图

 

代码:

void inorder(BiNode *bt)

{

    linklist_t *s = linkstack_init();

    BiNode *p=bt;

    while (p!=NULL&&linkstack_isempty(s)!=1)

    {

        while(p!=NULL)

        {

            linkstack_push (s,p->data);

            p=p->lchild;

        }

        if(linkstack_isempty(s)!=1)

        {

            p=linkstack_pop (s);

            printf("%d ",p->data);

            p=p->rchild;

        }

    }

}

后序遍历非递归算法(较难)

typedef struct element {

    BiNode *ptr;

    int flag;

} element;

void PostOrder(BiNode *bt) { //树的后序遍历

    SqStack s;

    s = InitStack_1();

    BiNode *p = bt;

    element elem;

    while (p != NULL || StackEmpty_1(&s) != 1) { //当p为空,栈也为空时退出循环

        if (p != NULL) {//第一次入栈,访问左子树

            elem.ptr = p;

            elem.flag = 1; //标记flag为1,表示即将第一次入栈

            Push_1(&s, elem); //将指针p的结点第一次压入栈中

            p = p->Lchild;

        } else {

            elem = Pop_1(&s); //出栈

            p = elem.ptr; //p指向当前要处理的结点

            if (elem.flag == 1) {

                //flag==1时,说明只访问过左子树,还要访问右子树

                elem.flag = 2;

                Push_1(&s, elem); //结点第二次压入栈中

                p = p->rchild;

            } else {

                //flag==2时,左右子树都已经访问过了

                visit(p->data);

                p = NULL; //访问后,p赋为空,确保下次循环时继续出栈(相当于回退)

            }

        }

    }

    DestroyStack_1(&s);

}

相关推荐

  1. 数据结构 | &

    2024-04-23 14:26:02       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-23 14:26:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-23 14:26:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-23 14:26:02       82 阅读
  4. Python语言-面向对象

    2024-04-23 14:26:02       91 阅读

热门阅读

  1. oracle数据库导出/导入

    2024-04-23 14:26:02       32 阅读
  2. XiaodiSec day038 Learn Note 小迪安全学习笔记

    2024-04-23 14:26:02       30 阅读
  3. 程序员缓解工作压力的小窍门

    2024-04-23 14:26:02       35 阅读
  4. [libopenh264 @ 0x563c78392040] Incorrect library version loaded

    2024-04-23 14:26:02       33 阅读
  5. MATLAB初学者入门(10)—— 粒子群算法

    2024-04-23 14:26:02       37 阅读
  6. 推荐两款好用开源分布式id生成器

    2024-04-23 14:26:02       38 阅读