user-0 提问: 二叉树的建立输入问题。。。

回复:
user: user-1
content: 应该 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); 			} 		} 	} }

user: user-2
content: #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; 		} 	} }

user: user-2
content: 引用 3 楼 csdcr 的回复:你输的'#'不够多，因为你的程序表明，如果父节点得到的ch不为#，则构建左右子树，那么问题就来了，如果你读入的字符串不够长，导致做左子树的时候就读完了，那么你递归进入右子树的时候，由于字符串读完，返回的均为EOF（-1），和#恒不相等，那么就会死循环 那怎么办、、

user: user-3
content: 你输的'#'不够多，因为你的程序表明，如果父节点得到的ch不为#，则构建左右子树，那么问题就来了，如果你读入的字符串不够长，导致做左子树的时候就读完了，那么你递归进入右子树的时候，由于字符串读完，返回的均为EOF（-1），和#恒不相等，那么就会死循环

user: user-1
content: 如果是windows fflush(stdin); scanf("%c", &ch);

user: user-4
content: 楼主用的是什么环境啊