二:二叉树的递归与非递归遍历

原创 2015年07月06日 16:56:52

以根结点的访问顺序纷飞前,中,后序


1. 前序遍历:


递归:

void PreOrder(BiTree *root)

{

   if(root!=NULL)

    {

       cout<<root->data<<" ";

        PreOrder(root->lchild);

        PreOrder(root->rchild);

    }

}

 

非递归:

voidPreOrder (BiTree *root) 

{

    stack<BiTree*> s;

    BiTree *p=root;

    while(p!=NULL||!s.empty())

    {

        while(p!=NULL)

        {

           cout<<p->data<<" ";

            s.push(p);

            p=p->lchild;

        }

        if(!s.empty())

        {

            p=s.top();

            s.pop();

            p=p->rchild;

        }

    }

}

 

2. 中序遍历:


递归:

voidInOrder (BiTree *root)

{

    if(root!=NULL)

    {

        InOrder (root->lchild);

        cout<<root->data<<"";

        InOrder (root->rchild);

    }

}


非递归:

voidInOrder (BiTree *root)      //非递归中序遍历

{

    stack<BiTree *> s;

    BiTree *p=root;

    while(p!=NULL||!s.empty())

    {

        while(p!=NULL)

        {

            s.push(p);

            p=p->lchild;

        }

        if(!s.empty())

        {

            p=s.top();

           cout<<p->data<<" ";

            s.pop();

            p=p->rchild;

        }

    }   

}


3. 后序遍历:


递归:

voidPostOrder(BiTree *root)  

{

    if(root!=NULL)

    {

        PostOrder(root->lchild);

        PostOrder (root->rchild);

        cout<<root->data<<"";

    }   

}


非递归:

在后序遍历中,要保证左孩子和右孩子都已被访问并且左孩子在右孩子前访问才能访问根结点。因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。


voidPostOrder(BiTree *root)   

{

    stack<BiTree*> s;

    BiTree *cur;                      //当前结点

    BiTree *pre=NULL;                 //前一次访问的结点

    s.push(root);

    while(!s.empty())

    {

        cur=s.top();

       if((cur->lchild==NULL&&cur->rchild==NULL)||

           (pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))

        {

           cout<<cur->data<<" ";  //如果当前结点没有孩子结点或者孩子节点都已被访问过

              s.pop();

            pre=cur;

        }

        else

        {

            if(cur->rchild!=NULL)

                s.push(cur->rchild);

            if(cur->lchild!=NULL)   

                s.push(cur->lchild);

        }

    }   

}

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

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

数据结构——二叉树的递归与非递归遍历(先序,中序,后序)

实验项目五 二叉树基本操作的实现 课程名称:数据结构 实验项目名称:二叉树基本操作的实现 实验目的: 1.掌握树的基本操作—遍历。 实验要求: 1、 分别用递归和非递归的方法实现一棵...
  • l18339702017
  • l18339702017
  • 2017年12月18日 20:32
  • 310

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

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

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

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

数据结构之二叉树的递归建立和遍历

1、二叉树概念     这里,得先明白树的概念      摘自:维基百科 在计算机科学中,树(英语:tree)是一种抽象资料型别(ADT)或是实作这种抽象资料型别的数据结构,用来模拟具树状结构性质...
  • HK_5788
  • HK_5788
  • 2016年05月05日 21:19
  • 1372

二叉树遍历的递归实现图解

http://jsj.ccut.edu.cn/sjjgweb/index.php?option=com_content&task=view&id=685 二叉树的遍历是二叉树各种操作的基础,所以...
  • YEYUANGEN
  • YEYUANGEN
  • 2011年12月14日 10:40
  • 2480

二叉树递归调用过程

二叉树是最常见最重要的数据结构之一,它的定义如下:   二叉树(binary tree)是有限多个节点的集合,这个结合或者是空集,或者由一个根节点和两颗互不相交的、分别称为左子树和右子树的二叉树...
  • I_love_blog
  • I_love_blog
  • 2017年03月27日 14:48
  • 1386

二叉树递归与非递归遍历

二叉树是一种常见的数据结构。二叉树有以下特点: 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。 二叉树的第i层至多有2^{i-1}个结点; ...
  • u010429311
  • u010429311
  • 2016年04月03日 23:58
  • 603

二叉树概念及递归与非递归遍历

一、数据结构分类 (一)按逻辑结构 集合(无辑关系) 线性结构(线性表):数组、链表、栈、队列 非线性结构:树、图、多维数组 (二)按存储结构 顺序(数组)储结构、链式...
  • wangweixaut061
  • wangweixaut061
  • 2012年01月04日 07:41
  • 2366

数据结构--二叉树--中序递归遍历二叉树(顺序结构)

#include /* EOF(=^Z或F6),NULL */ #include #define OK 1 #define ERROR 0 #define TRUE 1 #define ...
  • wangrunmin
  • wangrunmin
  • 2012年08月11日 09:19
  • 2362
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二:二叉树的递归与非递归遍历
举报原因:
原因补充:

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