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

本文介绍了一种使用堆栈实现二叉树先序遍历的方法,并通过具体的代码示例展示了如何将遍历结果转换为单向链表的形式。此外,还讨论了算法实现过程中的思考及简化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想了半天,还没想出来,真弱。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;
    }
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值