先根遍历二叉树的非递归算法(大虾们看看对不对)~~~
学数据结构,先根遍历二叉树树,书上给了递归算法,太简洁了;考虑到系统的堆栈内存比较小,大的树用递归可能会报错,所以写了个非递归的算法。(其实就是手动实现操作系统的堆栈功能,但是内存手动非配所以不会因为堆栈太大报错了),花了一个下午写的,大虾们看看对不对呀~~~~
程序代码://Preorder.c
typedef struct tNode{
char data;
struct tNode * lch;
struct tNode * rch;
}TreeNode;
/*
void Preorder(TreeNode * p)
{
if(p!=NULL)
{
printf("%c",p->data);
Preorder(p->lch);
Preorder(p->rch);
}
}
*/
//上面是递归算法,太简洁了~~~
================================================================================
//下面是非递归算法,基本思想是用堆栈模拟递归的调用过程(操作系统对递归的调用也是堆栈实现的)
typedef struct sNode{ //堆栈的结构定义
TreeNode * data; //指向树节点的指针,堆栈为空时值为NULL
//指示此树节点是否访问过(或者没有)左右孩子,0:没有,1:左孩子,2,右孩子;堆栈为空值为0
int status;
}StackNode;
void Preorder(TreeNode * p)
{
InitStack(s); //初始化堆栈S
TreeNode * cp=p; //cp是指向当前树节点的指针
while(cp!=NULL)
{
if(Get(s).status==0) //第一次进入此树节点,未访问左右子树
{
Insert(cp,0); //压入堆栈,两个参数分别传值给StackNode结构元素:data,status
printf("%c",cp->data);
Get(s).status=1;
if(cp->lch!=NULL)
{
cp=cp->lch; //切换当前节点到左孩子
continue;
}
else;
}
else;
if(Get(s).status<=1) //未访问过左右子树,或者只访问过左子树
{
Get(s).status=2;
if(cp->rch!=NULL)
{
cp=cp->rch; //切换当前节点到右孩子
continue;
}
else;
}
else;
if((Get(s).status==2) //已经访问左右子树,返回父节点;Get(s)返回当前堆栈顶的元素
{
Push(s); //弹出堆栈
cp=Get(s).data; //切换当前节点到父节点
}
else;
}
}
[ 本帖最后由 wsj3000 于 2009-10-26 01:03 编辑 ]







