二叉树的建立输入问题。。。

u012309996 2015-04-19 03:12:41
为什么我输入一直输入#,还是无法结束构建,一直在递归啊。。。
BiTree creat_tree(BiTree T)
{
char ch;
scanf("%c", &ch);
if ('#' == ch)
{
T = NULL;
}
else
{
T = (BiTree)malloc(sizeof(BiTree));
if (T==NULL)
{
printf("动态内存分配失败!");
exit(-1);
}
T->data = ch;
creat_tree(T->lchild);//递归构建左子树
creat_tree(T->rchild);////递归构建右子树
}
return T;
}
...全文
691 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiht594 2015-04-19
  • 打赏
  • 举报
回复
应该 scanf("%c", &ch); getchar(); 其他的改了一下, 勉强能用. 你自己再看看吧

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node
{
	char data;
	struct node * lchild;//左孩子
	struct node * rchild;//右孩子
}*BiTree, BiTNODE;
typedef struct Node
{
	BiTree data;
	struct Node * next;
} NODE, *PNODE;
typedef struct stack
{
	PNODE ptop;
	PNODE pbottom;
} STACK, *PSTACK;
BiTree creat_tree(BiTree &T);
void init_stack(PSTACK s);
void push_stack(PSTACK ps, BiTree val);
bool empty_stack(PSTACK ps);
BiTree pop_stack(PSTACK ps);
void traverse_zhongxu(BiTree root, PSTACK ps);
int main()
{
	BiTree T = NULL;
	T = creat_tree(T);
	STACK s;
	init_stack(&s);
	traverse_zhongxu(T, &s);
	fflush(stdin);
	getchar();
}
/*先序构建二叉树*/
BiTree creat_tree(BiTree &T)
{
	char ch;
	scanf_s("%c", &ch);
	getchar();

	if ('#' == ch)
	{
		T = NULL;
	}
	else
	{
		T = (BiTree)malloc(sizeof(BiTNODE));
		if (T == NULL)
		{
			printf("动态内存分配失败!");
			exit(-1);
		}
		T->data = ch;
		creat_tree(T->lchild);//递归构建左子树
		creat_tree(T->rchild);////递归构建右子树
	}
	return T;
}
/*栈初始化*/
void init_stack(PSTACK ps)
{
	ps->ptop = (PNODE)malloc(sizeof(NODE));//top指向新的节点
	if (ps->ptop == NULL)
	{
		printf("动态内存分配失败!");
		exit(-1);
	}
	else
	{
		ps->pbottom = ps->ptop;//此时为空栈,因此bottom和top指向的位置一样
	}
}
/*入栈*/
void push_stack(PSTACK ps, BiTree val)
{
	PNODE PNEW = (PNODE)malloc(sizeof(NODE));
	PNEW->data = val;//数据
	PNEW->next = ps->ptop;//新节点在栈顶  指针域指向它下面的节点  实际为新节点入栈之前的栈顶top
	ps->ptop = PNEW;//将top指向栈顶
}
/*判断空栈*/
bool empty_stack(PSTACK ps)
{
	if (ps->ptop == ps->pbottom)
		return true;
	else
		return false;
}
/*出栈*/
BiTree  pop_stack(PSTACK ps)
{
	BiTree t = NULL;
	if (empty_stack(ps))//(形参)ps=&S(实参)
		;
	else
	{
		PNODE p = ps->ptop;//临时p指向栈顶
		ps->ptop = p->next;//p->pnext将为出栈后的栈顶 所以ptop指向它
		t = p->data;
		free(p);//释放栈顶
	}
	return t;
}
/*非递归中序遍历*/
void traverse_zhongxu(BiTree root, PSTACK ps)
{
	BiTree q = root;
	if (q != NULL/* || empty_stack(ps)*/)
	{
		while (q != NULL)
		{
			push_stack(ps, q);
			printf("%d\n", q->data);
			q = q->lchild;
		}

		while (!empty_stack(ps))
		{
			q = ps->ptop->data;// 这里要把stack中存的BiTree指针取出来, 用来访问rchild
			pop_stack(ps);
			q = q->rchild;//这里访问rchild
			if (q)
			{
				printf("%d\n", q->data);
			}
		}
	}
}

阿呆的 2015-04-19
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node
{
	char data;
	struct node * lchild;//左孩子
	struct node * rchild;//右孩子
}*BiTree,BiTNODE;
typedef struct Node
{
	char data;
	struct Node * next;
}NODE,*PNODE;
typedef struct stack
{
	PNODE ptop;
	PNODE pbottom;
}STACK,*PSTACK;
BiTree creat_tree(BiTree T);
void init_stack(PSTACK s);
void push_stack(PSTACK ps, char val);
bool empty_stack(PSTACK ps);
bool pop_stack(PSTACK ps);
void traverse_zhongxu(BiTree root, PSTACK ps);
int main()
{
	BiTree T=NULL;
	creat_tree(T);
	STACK s;
	init_stack(&s);
	traverse_zhongxu(T, &s);
}
/*先序构建二叉树*/
BiTree creat_tree(BiTree T)
{
	char ch;
	fflush(stdin);
	scanf("%c", &ch);
	if ('#' == ch)
	{
		T = NULL;
	}
	else
	{
		T = (BiTree)malloc(sizeof(BiTNODE));
		if (T==NULL)
		{
			printf("动态内存分配失败!");
			exit(-1);
		}
		T->data = ch;
		creat_tree(T->lchild);//递归构建左子树	
		creat_tree(T->rchild);////递归构建右子树
	}
	return T;
}
/*栈初始化*/
void init_stack(PSTACK ps)
{
	ps->ptop = (PNODE)malloc(sizeof(NODE));//top指向新的节点
	if (ps->ptop = NULL)
	{
		printf("动态内存分配失败!");
		exit(-1);
	}
	else
	{
		ps->pbottom = ps->ptop;//此时为空栈,因此bottom和top指向的位置一样
	}
}
/*入栈*/
void push_stack(PSTACK ps, char val)
{
	PNODE PNEW = (PNODE)malloc(sizeof(NODE));
	PNEW->data = val;//数据
	PNEW->next = ps->ptop;//新节点在栈顶  指针域指向它下面的节点  实际为新节点入栈之前的栈顶top
	ps->ptop = PNEW;//将top指向栈顶
}
/*判断空栈*/
bool empty_stack(PSTACK ps)
{
	if (ps->ptop == ps->pbottom)
		return true;
	else
		return false;
}
/*出栈*/
bool pop_stack(PSTACK ps)
{
	if (empty_stack(ps))//(形参)ps=&S(实参)
		return false;
	else
	{
		PNODE p = ps->ptop;//临时p指向栈顶
		ps->ptop = p->next;//p->pnext将为出栈后的栈顶 所以ptop指向它
		free(p);//释放栈顶
	}
}
/*非递归中序遍历*/
void traverse_zhongxu(BiTree root,PSTACK ps)
{
	BiTree q = root; 
	while (q != NULL||empty_stack(ps))
	{
		while (q != NULL)
		{
			push_stack(ps, q->data);
			q = q->lchild;
		}
		while (empty_stack(ps))
		{
			pop_stack(ps);
			q = q->rchild;
		}
	}
}
阿呆的 2015-04-19
  • 打赏
  • 举报
回复
引用 3 楼 csdcr 的回复:
你输的'#'不够多,因为你的程序表明,如果父节点得到的ch不为#,则构建左右子树,那么问题就来了,如果你读入的字符串不够长,导致做左子树的时候就读完了,那么你递归进入右子树的时候,由于字符串读完,返回的均为EOF(-1),和#恒不相等,那么就会死循环
那怎么办、、
csdcr 2015-04-19
  • 打赏
  • 举报
回复
你输的'#'不够多,因为你的程序表明,如果父节点得到的ch不为#,则构建左右子树,那么问题就来了,如果你读入的字符串不够长,导致做左子树的时候就读完了,那么你递归进入右子树的时候,由于字符串读完,返回的均为EOF(-1),和#恒不相等,那么就会死循环
jiht594 2015-04-19
  • 打赏
  • 举报
回复
如果是windows fflush(stdin); scanf("%c", &ch);
常书 2015-04-19
  • 打赏
  • 举报
回复
楼主用的是什么环境啊

69,369

社区成员

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

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