先根遍历二叉树的非递归算法(大虾们看看对不对)~~~
学数据结构,先根遍历二叉树树,书上给了递归算法,太简洁了;考虑到系统的堆栈内存比较小,大的树用递归可能会报错,所以写了个非递归的算法。(其实就是手动实现操作系统的堆栈功能,但是内存手动非配所以不会因为堆栈太大报错了),花了一个下午写的,大虾们看看对不对呀~~~~程序代码:
//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 编辑 ]