二叉树非递归后序遍历
来源:百度知道 编辑:UC知道 时间:2024/06/02 18:35:19
#include <stdio.h>
#include <stdlib.h>
//#include <conio.h>
struct TREE //二叉树结点结构
{
char data;
struct TREE *lsubtree;
struct TREE *Rsubtree;
};
struct TREE *tree;
void createtree(struct TREE *&p) //先序创建二叉树
{
char ch;
ch = getchar();
if (ch == '\n')
{
p = NULL;
}
else if(ch == '.')
p = NULL;
else
{
p = (struct TREE*)malloc(sizeof(struct TREE));//分配结点空间
p->data = ch;
createtree(p->lsubtree); //递归创建左子树
createtree(p->Rsubtree); //递归创建右子树
}
return;
}
void lastorder(TREE *tree)//非递归后序遍历
{
struct TREE *p;
struct TREE *s[100];//用一个指针数组来用作栈
int top=-1;//下标
int mack[100];//标志数组
p=tree;
do
{
while(
你只要后序遍历成功对吧,你的错误真难找,很细微的错误.
错误在下面那个函数:
void lastorder(TREE *tree)//非递归后序遍历
{
struct TREE *p;
struct TREE *s[100];//用一个指针数组来用作栈
int top=-1;//下标
int mack[100];//标志数组
p=tree;
do
{
while(p!=NULL)//循环 直到让p向左滑到最左子树
{ top=top+1;
s[top]=p;//每循环一次,当前结点入栈
mack[top]=1;//结点第一次入栈时,标志为1
p=p->lsubtree;//找最左子树
}
这句就错了,应该是:
while((p->lsubtree)!=NULL)//循环 直到让p向左滑到最左子树
写成你那样的话,p的值这时都成null了,后面还做什么呀?应该是判断p左边还有没有,没有了那p就是最左的了.
是最左的了,那么就该把他打出来,那么下面就该加上
printf("%c\n",p->data);
还有这里:
p=s[top];//出栈顶元素
top=top-1;//每出一个栈顶元素,下标就后退一位
if (mack[top]==1)//若结点是第一次出栈,则再入栈
你让top退了一位,那么下面的判断还是判断这个节点了么?你成判断上个节点了!
所以是
if (mack[top+1]==1)//若结点是第一次出栈,则再入栈
最后呢,while (top!=-1 || p!=NULL); 要知道p不可能为NULL的,你这样会死循环诶!
要不就写成while (top!=-1);
另外指出你的一个bug就是当二叉树为空时,do wile语句是先做再判断的,为空时,
p=s[top];//出栈顶