二叉数非递归遍历程序编译出错,c语言,栈,指针

cqnuztq 2013-05-06 11:05:58
想实现二叉树的非递归算法,但是指针压栈的时候出错了,暂时没能改过来,各位大侠帮帮忙,谢谢
源代码:
#include<stdio.h>
#include<stdlib.h>

#define STACKINITSIZE 100
#define STACKINCREASESIZE 10

typedef char ElemType;
//树结构
typedef struct tree
{
ElemType data;
struct tree * lchild;
struct tree * rchild;
}TreeNode,*Tree;

//栈结构
typedef struct stack
{
struct tree * base;
struct tree * top;
int stacksize;
}Sqstack;


/*****************栈的操作声明********************/

//初始化栈
void InitStack( Sqstack &s );
//元素入栈
void Push( Sqstack &s, Tree e );
//获得栈顶元素
void GetTop( Sqstack s, Tree &e );
//弹出栈顶元素
void Pop( Sqstack &s, Tree &e );
//判断栈是否为空,为空返回1,否则返回0
int StackEmpty( Sqstack s );

/*****************栈的操作声明********************/


/*****************树的操作声明********************/
//创建树,以先序序列建立树
void CreateTree(Tree &t);
//递归先序遍历
void PreOrder(Tree t);
//非递归先序遍历
void PreOrder1(Tree t);
//递归中序遍历
void InOrder(Tree t);
//非递归中序遍历
void InOrder1(Tree t);
//递归后序遍历
void PostOrder(Tree t);
/*****************树的操作声明********************/

int main()
{
Tree T;
printf("\n按先序序列输入结点序列,'#'代表空:");
CreateTree(T);
printf("\n先序遍历的结果:");
PreOrder(T);
printf("\n中序遍历的结果:");
//InOrder(T);
InOrder1(T);
printf("\n后序遍历的结果:");
PostOrder(T);
printf("\n");
}


/*****************栈的操作定义********************/

//初始化栈
void InitStack( Sqstack &s )
{
s.base = (Tree)malloc(STACKINITSIZE*sizeof(Tree));
if ( !s.base )
{
printf("InitStack内存分配出错\n");
}
s.top = s.base;
s.stacksize = STACKINITSIZE;
}

//元素入栈
void Push( Sqstack &s, Tree e )
{
if ( s.top - s.base >= s.stacksize )
{
s.base = (Tree)realloc(s.base,(s.stacksize+STACKINCREASESIZE)*sizeof(Tree));
if ( !s.base )
{
printf("Push内存分配出错\n");
return ;
}
s.top = s.base + s.stacksize;
s.stacksize += STACKINCREASESIZE;
}
*s.top++ = e;
}

//获得栈顶元素
void GetTop( Sqstack s, Tree &e )
{
e = *(s.top - 1);
}

//弹出栈顶元素
void Pop( Sqstack &s, Tree &e )
{
if ( s.top == s.base )
{
printf("栈为空\n");
return ;
}

e = *(s.top - 1);
s.top--;
}

//判断栈是否为空,为空返回1,否则返回0
int StackEmpty( Sqstack s )
{
if ( s.top == s.base )
return 1;
return 0;
}

/*****************栈的操作定义********************/



/*****************树的操作定义********************/
//创建树,以先序序列建立树
void CreateTree(Tree &t)
{
char ch;
scanf("%c",&ch);
if ( ch == '#' )
t = NULL;
else
{
t = (Tree)malloc(sizeof(TreeNode));
if ( !t )
{
printf("分配内存出错!");
return ;
}
t->data = ch;
CreateTree(t->lchild);
CreateTree(t->rchild);
}
}


//递归先序遍历
void PreOrder(Tree t)
{
if ( t )
{
printf("%c",t->data);
PreOrder(t->lchild);
PreOrder(t->rchild);
}
}


//递归中序遍历
void InOrder(Tree t)
{
if ( t )
{
InOrder(t->lchild);
printf("%c",t->data);
InOrder(t->rchild);
}
}


//非递归中序遍历
void InOrder1(Tree t)
{
Tree p = t;
Sqstack s;
InitStack(s);

while ( p || !StackEmpty(s) )
{
if ( p->lchild )
Push(p->lchild);
else
{
Pop(p);
printf("%c",t->data);
p = p->rchild;
}
}
}


//递归后序遍历
void PostOrder(Tree t)
{
if ( t )
{
PostOrder(t->lchild);
PostOrder(t->rchild);
printf("%c",t->data);
}
}




错误信息:
...全文
185 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2013-05-07
  • 打赏
  • 举报
回复
s.base = (Tree)malloc(STACKINITSIZE*sizeof(Tree));逻辑不对,貌似你要的是: typedef struct stack { Tree * base; Tree * top; ... void InitStack( Sqstack &s ) { s.base = (Tree *)malloc(STACKINITSIZE*sizeof(Tree));
jimye 2013-05-07
  • 打赏
  • 举报
回复
引用 2 楼 cqnuztq 的回复:
引用
1、栈的实现有问题,栈存储树节点的副本,修改了栈的各个方法
不可以只存一个指向节类型的指针吗?存一个节点的副本是不是有点浪费空间哦?
栈一般都是直接存结点副本的吧,不怕多这一点空间吧。你要是真想存指针,那你可以试试修改,然后这时候要注意top和base都是指向树节点指针的指针了。
cqnuztq 2013-05-07
  • 打赏
  • 举报
回复
引用
1、栈的实现有问题,栈存储树节点的副本,修改了栈的各个方法
不可以只存一个指向节类型的指针吗?存一个节点的副本是不是有点浪费空间哦?
cqnuztq 2013-05-07
  • 打赏
  • 举报
回复
楼上的正解,明白了,一楼的也给我了很大帮助,谢谢大家
jimye 2013-05-06
  • 打赏
  • 举报
回复
1、栈的实现有问题,栈存储树节点的副本,修改了栈的各个方法 2、非递归中序遍历有问题 对比一下,修改后的代码:
#include<stdio.h>
#include<stdlib.h>

#define STACKINITSIZE 100
#define STACKINCREASESIZE 10

typedef char ElemType;
//树结构
typedef struct tree
{
	ElemType data;
	struct tree * lchild;
	struct tree * rchild;
}TreeNode,*Tree;

//栈结构
typedef struct stack
{
	struct tree * base;
	struct tree * top;
	int stacksize;
}Sqstack;


/*****************栈的操作声明********************/

//初始化栈
void InitStack( Sqstack &s );
//元素入栈
void Push( Sqstack &s, Tree e );
//获得栈顶元素
void GetTop( Sqstack s, Tree &e );
//弹出栈顶元素
void Pop( Sqstack &s, Tree &e );
//判断栈是否为空,为空返回1,否则返回0
int StackEmpty( Sqstack s );



/*****************树的操作声明********************/
//创建树,以先序序列建立树
void CreateTree(Tree &t);
//递归先序遍历
void PreOrder(Tree t);
//非递归先序遍历
void PreOrder1(Tree t);
//递归中序遍历
void InOrder(Tree t);
//非递归中序遍历
void InOrder1(Tree t);
//递归后序遍历
void PostOrder(Tree t);
/*****************树的操作声明********************/

int main()
{
	Tree T;
	printf("\n按先序序列输入结点序列,'#'代表空:");
	CreateTree(T);
	printf("\n先序遍历的结果:");
	PreOrder(T);
	printf("\n中序遍历的结果:");
	//InOrder(T);
	InOrder1(T);
	printf("\n后序遍历的结果:");
	PostOrder(T);
	printf("\n");
}


/*****************栈的操作定义********************/

//初始化栈
void InitStack( Sqstack &s )
{
	s.base = (Tree)malloc(STACKINITSIZE*sizeof(TreeNode));
	if ( !s.base )
	{
		printf("InitStack内存分配出错\n");
	}    
	s.top = s.base;
	s.stacksize = STACKINITSIZE;
}

//元素入栈
void Push( Sqstack &s, Tree e )
{
	if ( s.top - s.base >= s.stacksize )
	{
		s.base = (Tree)realloc(s.base,(s.stacksize+STACKINCREASESIZE)*sizeof(TreeNode));
		if ( !s.base )
		{
			printf("Push内存分配出错\n");
			return ;
		}
		s.top = s.base + s.stacksize;
		s.stacksize += STACKINCREASESIZE;
	}
	*s.top++ = *e;
}

//获得栈顶元素
void GetTop( Sqstack s, Tree &e )
{
	e = s.top - 1;
}

//弹出栈顶元素
void Pop( Sqstack &s, Tree &e )
{
	if ( s.top == s.base )
	{
		printf("栈为空\n");
		return ;
	}

	e = --s.top;
}

//判断栈是否为空,为空返回1,否则返回0
int StackEmpty( Sqstack s )
{
	if ( s.top == s.base )
		return 1;
	return 0;
}

/*****************树的操作定义********************/
//创建树,以先序序列建立树
void CreateTree(Tree &t)
{
	char ch;
	scanf("%c",&ch);
	if ( ch == '#' )
		t = NULL;
	else
	{
		t = (Tree)malloc(sizeof(TreeNode));
		if ( !t )
		{
			printf("分配内存出错!");
			return ;
		}
		t->data = ch;
		CreateTree(t->lchild);
		CreateTree(t->rchild);
	}
}


//递归先序遍历
void PreOrder(Tree t)
{
	if ( t )
	{
		printf("%c",t->data);
		PreOrder(t->lchild);
		PreOrder(t->rchild);
	}
}


//递归中序遍历
void InOrder(Tree t)
{
	if ( t )
	{
		InOrder(t->lchild);
		printf("%c",t->data);
		InOrder(t->rchild);
	}
}


//非递归中序遍历
void InOrder1(Tree t)
{
	Tree p = t;
	Sqstack s;
	InitStack(s);  

	while ( p || !StackEmpty(s) )
	{
		if (p)
		{
			Push(s, p);
			p = p->lchild;
		}
		else
		{
			Pop(s, p);
			printf("%c",p->data);
			p = p->rchild;
		} 
	}

}


//递归后序遍历
void PostOrder(Tree t)
{
	if ( t )
	{
		PostOrder(t->lchild);
		PostOrder(t->rchild);
		printf("%c",t->data);
	}
}
VC++ MFC 经典教程 - 基础篇 1.CP_YourFirstWindowsProgram.mp4 10.MFC_GDI_画直线和曲线.mp4 11.MFC_GDI_画椭圆_多边形及其他形状.mp4 12.MFC_GDI_画笔和画刷.mp4 13.MFC_GDI_画文本和字体.mp4 14.MFC_GDI_备用对象和取消选定.mp4 15.MFC_Ruler.mp4 16.MFC_窗口滚动条.mp4 17.MFC_Accel.mp4 18.MFC_Accel(2).mp4 19.MFC_消息框.mp4 2.Windows_编程模型.mp4 20MFC_客户区鼠标消息.mp4 21.MFC_TicTac-1.mp4 22.MFC_TicTac-2.mp4 23.MFC_TicTac-3.mp4 24.MFC_鼠标滚轮.mp4 25.MFC_捕获鼠标.mp4 26.MFC_VisualKB-1.mp4 27.MFC_VisualKB-2.mp4 29.MFC_菜单.mp4 3.MFC_第一个MFC程序设计.mp4 30.MFC_CButton类.mp4 31.MFC_E_FontView-1.mp4 32.MFC_E_FontView-2.mp4 33.MFC_CEdit类.mp4 34.MFC_MyPad.mp4 35.MFC_对话框_静态文本_编辑框.mp4 36.MFC_对话框_访问控件_7种方法_A.mp4 37.MFC_对话框_访问控件_7种方法_B.mp4 38.MFC_对话框_访问控件_7种方法_C.mp4 39.MFC_对话框_复选框_单选钮.mp4 4.MFC_消息映射.mp4 40.MFC_模态对话框.mp4 41.MFC_非模态对话框.mp4 42.MFC_属性表.mp4 43.MFC_公用对话框.mp4 44.MFC_组类-1.mp4 45.MFC_组类-2.mp4 46.MFC_CArray.mp4 47.MFC_列表类.mp4 48.MFC_映射类.mp4 49.MFC_类型指针类.mp4 5.MFC_使用向导快速进行MFC程序设计.mp4 50.MFC_CFile.mp4 51.MFC_CArchive.mp4 52.MFC_四个对象四种方法.mp4 53. MFC_Ruler.mp4 54.MFC_Ruler.mp4 55.MFC_Ruler.mp4 56.MFC_SdiSquares.mp4 57.MFC_Scroll_Ruler.mp4 58.MFC_CHtmlView.mp4 59.MFC_CTreeView.mp4 6.MFC_字符集和TEXT宏.mp4 60.MFC_CListView.mp4 61.MFC_MdiSquares.mp4 62.MFC_动态拆分窗口.mp4 63.MFC_ToolBar.mp4 64.MFC_ToolBar_Ex13a.mp4 65.MFC_StatusBar.mp4 66.MFC_StatusBar_Ex13b.mp4 67.MFC_Rebar.mp4 68.MFC_EZPrint.mp4 69.MFC_Print_Bubble.mp4 7.MFC_建立应用程序.mp4 8.MFC_第一个MFC程序设计(不用向导).mp4 9.MFC_Windows_GDI_设备描述表类.mp4 据结构与算法_C语言 01.swap.mp4 02.BubbleSort.mp4 03.SelecttionSort.mp4 04.顺序查找.mp4 05.C_DS_折半查找.mp4 06.递归.mp4 07递归算法_折半查找.mp4 08.Permutations.mp4 09.插入排序.mp4 10.快速排序.mp4 11.归并排序.mp4 12.顺序.mp4 13.顺序队列.mp4 14.链表的基本概念.mp4 15.单链表的基本运算.mp4 16.循环单链表.mp4 17.双向链表.mp4 18.链式.mp4 19.链式队列.mp4 20.基排序.mp4 21.树.mp4 22.二叉树的存储表示与实现.mp4 23.二叉树的遍历.mp4 24.二叉查找树.mp4 25.红黑树.mp4 26.堆.mp4 27.堆排序.mp4 28.哈希表.mp4 29.图_邻接矩阵

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧