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

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

不用栈,来实现二叉树的非递归中序遍历

如果要求只能用非递归方法,同时还不让用栈,来遍历完全二叉树,则每个结点必须有一个指向父结点的指针。 题目: 完全二叉树,采用三叉链表结构。 要求 不用递归,中序遍历这棵树。要求空间复杂度...
  • friendbkf
  • friendbkf
  • 2015年12月02日 16:04
  • 1111

数据结构-----前序遍历二叉树非递归算法(利用堆栈实现)

一、非递归前序算法遍历思想:        (1)
  • u011459278
  • u011459278
  • 2014年04月19日 17:18
  • 2278

使用栈,非递归先序遍历二叉树T

/********** 【题目】试利用栈及其基本操作写出二叉树T的非递归 的先序遍历算法。 二叉链表类型定义: typedef struct BiTNode { TElemType data; ...
  • qq1094417747
  • qq1094417747
  • 2016年10月16日 12:12
  • 1578

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

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

第6章 树和二叉树——递归方法先序、中序、后序遍历二叉链表表示的二叉树

/* * 这个程序首先先序构造一个二叉链表表示的二叉树, * 二叉树表示的是一份三代的家谱, * 然后分别用递归的方法先序、中序、后序遍历这棵二叉树。 */ #include #incl...
  • weixinwei021
  • weixinwei021
  • 2013年05月30日 21:35
  • 673

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

转自 http://blog.csdn.net/yushuai007008/article/details/7101663 如有不足之处,还望指正! [cpp] view pl...
  • ringrang
  • ringrang
  • 2014年08月31日 17:17
  • 344

非递归先序遍历二叉树(2)

/*非递归先序遍历二叉树*/ #include #define maxsize 100 typedef char datatype; /*二叉链表类型定义*/ typedef struct Binno...
  • dwenxue
  • dwenxue
  • 2017年05月18日 17:01
  • 143

非递归先序中序后序遍历二叉树

先序遍历 void preOrder(TNode* root) { if ( root != NULL) { Stack S; S.push(root...
  • shen823797837
  • shen823797837
  • 2013年03月28日 10:47
  • 1114

非递归先序遍历二叉树

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

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

/*递归算法虽然简洁,但一般而言,其执行效率不高 *所占用的空间与运行的时间都比非递归算法多 *在这里把二叉树非递归遍历(先序、中序、后序、层序)实现(使用了栈和队列) *这里我们约定:空的节点...
  • pisces_hao
  • pisces_hao
  • 2012年10月19日 13:45
  • 804
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不用递归——用栈——实现先序遍历二叉树的算法
举报原因:
原因补充:

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