不用递归——用栈——实现先序遍历二叉树的算法

原创 2007年09月20日 12:09:00
想了半天,还没想出来,真弱。G了一圈,看到答案,哎!更弱,很简单……


”算法:用堆栈实现
创建堆栈
把根节点压入堆栈
当堆栈不为空时,循环
      弹出一个节点
      如果这个节点不是NULL
               输出该值
               把这个节点的右节点压入堆栈
               把这个节点的左节点压入堆栈


void PreOderTranversal(node *root)

{

    element *TheStack;

    void *data;

    node *CurNode;

   

    CreateStack(&TheStack);

    Push(&TheStack, root);

   

    while(Pop(&TheStack, &data)){

        CurNode = (node *)data;

        if(CurNode){

            printf("%d/n", CurNode->value);

            Push(&TheStack, CurNode->right);

            Push(&TheStack, CurNode->left);

        }

       

    }

    DeleteStack(&TheStack);

} 
其实还不大完善,不过问题已经不大了。这么简单的问题,让我给想得忒复杂.......郁闷,看来我的思维能力还是有所欠缺啊

后记:现在我给出一个比较完善的程序:
/*不用递归先序遍历一棵树,并把其节点组成一个单向链表*/

#include <stdio.h>
#include <iostream>
#include <stack>
using namespace std;

struct _Node {
 _Node *next;
};

struct _Tree {
 _Tree *left;
 _Tree *right;
};

_Node *MakeList(_Tree *root)
{
 stack<_Tree*> sk;
 _Node *head = NULL;
 _Tree *tmp;
 _Node *current,*news;

 head = new _Node;
 head = (_Node*)root;
 head->next = NULL;
 current = head;
 sk.push(root);
 while ( !sk.empty() ) {
  tmp = sk.top();
  sk.pop();

   if (tmp != root) {

  news = new _Node;
  current->next = news;
  news->next = NULL;
  current = news;
  news = (_Tree*)tmp;
}

  if (tmp->right != NULL)
   sk.push(tmp->right);
  else if (tmp->left != NULL)
   sk.push(tmp->left);
 }
 return head;
}



这里发现左结点压栈之后马上又出栈,所以可以进一步简化成如下结构:

push(root);
while(stack is not empty){
    pop(p);
    while(p!=null){
        visit(p);
        push(p->rchild);
        p=p->lchild;
    }
}
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

遍历二叉树的各种操作(非递归遍历)

先使用先序的方法建立一棵二叉树,然后分别使用递归与非递归的方法实现前序、中序、后序遍历二叉树,并使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组...

详细讲解二叉树三种遍历方式的递归与非递归实现

详细讲解二叉树三种遍历方式的递归与非递归实现 分类: 数据结构随笔2013-10-24 08:58 518人阅读 评论(14) 收藏 举报 二叉树是一种非常重要的数据结...
  • pi9nc
  • pi9nc
  • 2013-10-24 23:44
  • 39141

不使用递归和栈遍历二叉树

二叉树遍历一共三种方式(暂且不把层次遍历算在内),前序,中序和后序,而每种遍历又分为递归和非递归版本。不管是递归还是非递归,都用到了栈。为什么要用栈?那是因为其他的方式没法记录当前节点的parent,...

先序非递归遍历二叉树解析——面试高频数据结构

一、基本概念 二叉树是笔试面试中高频数据结构。 而二叉树的遍历是解决一切二叉树题目的基础。因此,有必要熟练掌握二叉树的遍历方法,包括递归方法 和 非递归方法。 由于递归方法比较简单,因此,这里我...

C++实现链式二叉树,采用非递归的方式先序,中序,后序遍历二叉树

转自 http://blog.csdn.net/yushuai007008/article/details/7101663 如有不足之处,还望指正! [cpp] view pl...

非递归遍历二叉树(先序、中序、后序、层序)

/*递归算法虽然简洁,但一般而言,其执行效率不高 *所占用的空间与运行的时间都比非递归算法多 *在这里把二叉树非递归遍历(先序、中序、后序、层序)实现(使用了栈和队列) *这里我们约定:空的节点...

非递归先序遍历二叉树

非递归先序遍历二叉树由于要用到回溯,因此需要保存已访问过的根节点的指针。可以用栈来保存已访问过的根节点的指针,用于回溯。 代码如下 #include #define OK 1; #defin...

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

我们知道二叉树是一种递归定义的数据结构,包括二叉树的创建、遍历、求树高、叶子节点个数等等。使用递归来进行以上操作非常的简便,相关实现请参考 《C语言实现二叉树的基本操作》。但是今天我们剑走偏锋,使用非...

数据结构练习题——先序遍历二叉树

描述 给定一颗二叉树,要求输出二叉树的深度以及先序遍历二叉树得到的序列。本题假设二叉树的结点数不超过1000。 输入 输入数据分为多组,第一行是测试数据的组数n,下面的n行分别代表一棵二...

先序遍历二叉树的算法

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

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