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

原创 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);

        }

    }   

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

二叉树的非递归遍历

【经典面试题二】二叉树的递归与非递归遍历(前序、中序、后序)

http://www.cnblogs.com/SHERO-Vae/p/5800363.html  【写在前面】   二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础...

二叉树的非递归遍历

  • 2012-10-20 18:08
  • 344KB
  • 下载

二叉树非递归遍历

  • 2013-03-09 13:50
  • 38KB
  • 下载

二叉树递归与非递归遍历

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

二叉树非递归遍历

【应聘笔记系列】二叉树的递归与非递归遍历实现

二叉树是应聘面试笔试中的宠儿,下面直接上代码。 // BinaryTree.cpp : Defines the entry point for the console application. /...

二叉树非递归遍历C

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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