C语言,数据结构,二叉树的递归构造,求大神教导,使其正常运行。
#include <stdio.h>#include <stdlib.h>
typedef char ElementType ;
struct binaryTreeNode
{
ElementType data;
struct binaryTreeNode *LeftChild,*RightChild;
};
typedef struct binaryTreeNode BinaryTreeNode;
void BTreeCreate(BinaryTreeNode **T)
{
char x;
scanf("%c",&x);
if(x == ' ')
(*T) = NULL;
else
{
(*T) = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
(*T)->data = x;
/*三行printf用于检验,发现下面printf语句会发生重复,我百思不得其解,求指导*/
printf("%d\n",(*T));
printf("%d\n",(*T)->LeftChild);
printf("%d\n",(*T)->RightChild);
BTreeCreate(&((*T)->LeftChild));
BTreeCreate(&((*T)->RightChild));
}
}
void PreOrder(BinaryTreeNode *t)
{
if(t)
{
printf("%c",t->data);
PreOrder(t->LeftChild);
PreOrder(t->RightChild);
}
}
void InOrder(BinaryTreeNode *t)
{
if(t)
{
InOrder(t->LeftChild);
printf("%c",t->data);
InOrder(t->RightChild);
}
}
void PostOrder(BinaryTreeNode *t)
{
if(t)
{
PostOrder(t->LeftChild);
PostOrder(t->RightChild);
printf("%c",t->data);
}
}
int main(void)
{
BinaryTreeNode *t;
BTreeCreate(&t);
printf("\n先序:");PreOrder(t);
printf("\n后序:");InOrder(t);
printf("\n中序:");PostOrder(t);
printf("\n");
return 0;
}
输入a,编译结果
输入空格,编译结果
回答:
在 scanf("%c",&x);
后面加一句: getchar();
就可以工作了.
原因是, 你每次敲的回车, 还在输入缓存里, 下一次递归, 会跳过输入过程, 直接将 x 获取为 '\n'. 所以会输出两遍...
另外, 提醒一下你.
printf("\n后序:");InOrder(t);printf("\n中序:");PostOrder(t);
这里写反了. InOrder
是中序, PostOrder
是后序.
回答:
我打断点简单测了一下,符合我的猜想,即:
先执行
BTreeCreate(&t);第一次递归,走的是
char x;
scanf("%c",&x);
if(x == ' ')//不符合
(*T) = NULL;
else
{
//进入else
(*T) = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
(*T)->data = x;
/*三行printf用于检验,发现下面printf语句会发生重复,我百思不得其解,求指导*/
//输入a之后,走下面的代码(若没有输入就会在else到printf之间循环递归)
//打印第一次printf
printf("%d\n",(*T));
printf("%d\n",(*T)->LeftChild);
printf("%d\n",(*T)->RightChild);
//执行LeftChild的创建,进入第二次递归
BTreeCreate(&((*T)->LeftChild));
//第二次递归,没有输入,if 判断不符合,在else到printf之间循环递归
作业还是要自己做,其他的帮不了
回答:
一开始就来讨论并不好...
以上是 C语言,数据结构,二叉树的递归构造,求大神教导,使其正常运行。 的全部内容, 来源链接: utcz.com/p/195341.html