二叉树的遍历算法(递归和非递归)

原创 2016年08月30日 23:57:12

二叉树的遍历

1.递归实现

void PreOrder(BiTree T)
{
    if(T!=NULL)
    {
        printf("%d ",T->data);
        PreOrder(T->lchlid);
        PreOrder(T->rchlid);
    }
}
void InOrder(BiTree T)
{
    if(T!=NULL)
    {
        InOrder(T->lchlid);
        printf("%d ",T->data);
        InOrder(T->rchlid);
    }
}
void PostOrder(BiTree T)
{
    if(T!=NULL)
    {
        PostOrder(T->lchlid);
        PostOrder(T->rchlid);
        printf("%d ",T->data);
    }
}

2.非递归实现

前序遍历

void _PreOrder(BiTree T)
{
    BiTree p=T; top=-1;
    Stack[++top]=p;
    while(top>=0)
    {
        p=Stack[top--];
        printf("%d ",p->data);
        if(p->rchlid)   Stack[++top]=p->rchlid;
        if(p->lchlid)   Stack[++top]=p->lchlid;
    }
}

中序遍历

void _InOrder(BiTree T)
{
    BiTree p=T; top=-1;
    while(p||top>=0)
    {
        if(p)
        {
            Stack[++top]=p;
            p=p->lchlid;
        }
        else
        {
            p=Stack[top--];
            printf("%d ",p->data);
            p=p->rchlid;
        }
    }
}

后序遍历

void _PostOrder(BiTree T)
{
    BiTree p=T,r=NULL;
    top=-1;
    while(p||top>=0)
    {
        if(p)
        {
            Stack[++top]=p;
            p=p->lchlid;
        }
        else
        {
            p=Stack[top];
            if(p->rchlid&&p->rchlid!=r)
            {
                p=p->rchlid;
            }
            else
            {
                top--;
                printf("%d ",p->data);
                r=p;
                p=NULL;
            }
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

史上最简明易懂非递归遍历二叉树算法

三种不同的遍历方式区别在于栈空间的释放时机和输出结点信息时机的不同:先序和中序遍历是在访问栈顶元素的右孩子(右子树)之前退栈,而后序遍历在访问右子树之后退栈;先序遍历是在某结点入栈时输出其信息,而中序...
  • QiaoRuoZhuo
  • QiaoRuoZhuo
  • 2014年10月29日 14:59
  • 3679

【数据结构与算法】二叉树递归与非递归遍历(附完整源码)

二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有前、中、后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但...
  • mmc_maodun
  • mmc_maodun
  • 2013年10月24日 08:58
  • 40493

对于二叉树三种非递归遍历方式的理解

利用栈实现二叉树的先序,中序,后序遍历的非递归操作 栈是一种先进后出的数据结构,其本质应是记录作用,支撑回溯(即按原路线返回);因此,基于其的二叉树遍历操作深刻的体现了其特性: 1.先入、后出,只...
  • sdulibh
  • sdulibh
  • 2016年01月24日 11:25
  • 1260

Java实现二叉树后序非递归遍历(好理解)

//不明白的大家可以一起讨论!欢迎留言! /** * public class Node { public int data; //树结点标号 public Node lchild; ...
  • zhuqiuhui
  • zhuqiuhui
  • 2016年05月04日 23:32
  • 2291

二叉树的四种遍历的递归和非递归的实现

二叉树的三种遍历为:前序遍历,中序遍历和后序遍历。 遍历的实现可分为递归和非递归。递归法与二叉树的定义相似,非递归法采用栈去模拟实现。 一、前序遍历的次序为:根结点——左结点——右结点。 递归法实现:...
  • xiaominkong123
  • xiaominkong123
  • 2016年06月02日 16:50
  • 407

二叉树几种遍历算法的非递归实现

二叉树遍历的非递归实现 相对于递归遍历二叉树,非递归遍历显得复杂了许多,但换来的好处是算法的时间效率有了提高。下面对于我学习非递归遍历二叉树算法的过程进行总结为了便于理解,这里以下图的二叉树为例,分析...
  • kelvinmao
  • kelvinmao
  • 2016年05月15日 11:43
  • 4505

二叉树递归非递归遍历(递归前中后,非递归前中后,层次遍历,凹入打印法等)

由于所有的递归算法都可以借助于堆栈转换成循环结构的非递归算法。方法一:形式化模拟转换。方法二:根据要求解问题的特点设计借助于堆栈的循环结构算法。而此次正好是利用第二种按方法求解。1.1非递归前序遍历:...
  • xiaofei__
  • xiaofei__
  • 2016年05月30日 21:28
  • 3914

二叉树三种遍历算法递归和非递归实现

//二叉树 三种遍历方式的 递归非递归实现 #include #include using namespace std; typedef struct BiTreeNode {     int...
  • w616589292
  • w616589292
  • 2016年02月28日 10:49
  • 975

二叉树的递归和非递归方式的三种遍历

二叉树的三种遍历方式,前序遍历,中序遍历,后序遍历,中的前中后都是指的是根节点的访问顺序,这三种遍历方式的概念在这里就不多说了,太普遍了! 二叉树的建立 我们这里以前序遍历为例: 我们先定...
  • woshinannan741
  • woshinannan741
  • 2016年10月16日 13:18
  • 706

经典算法学习——非递归遍历二叉树

我们知道二叉树是一种递归定义的数据结构,包括二叉树的创建、遍历、求树高、叶子节点个数等等。使用递归来进行以上操作非常的简便,相关实现请参考 《C语言实现二叉树的基本操作》。但是今天我们剑走偏锋,使用非...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016年10月03日 12:28
  • 2273
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树的遍历算法(递归和非递归)
举报原因:
原因补充:

(最多只允许输入30个字)