大家好,在做二叉树的实验时遇到了一些问题,主要描述见附件,主要涉及的是字符的输入问题,请大家讨论一下这个问题该怎么解决。不防运行一下这个程序,我在这里也不好怎么说明白。谢谢!
#include"stdio.h"
#include"malloc.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -1
/* 定义TelemType为char类型 */
typedef char TelemType;
typedef int Status;
/* 二叉树的结点类型 */
typedef struct BitNode
{ TelemType data;
struct BitNode *lchild,*rchild;
}BitNode,*BiTree;
//初始化二叉树,即把树根指针置空
Status BinTreeInit(BiTree &BT)
{
BT=(BitNode *)malloc(sizeof(BitNode));
if(!BT) return OVERFLOW;
BT=NULL;
return OK;
}//BinTreeInit
// 按先序次序建立一个二叉树
Status BinTreeCreat(BiTree &BT)
{
char ch; scanf("%c",&ch);
if(ch=='#') BT=NULL; //"#"表示没有这个结点
else{
BT=(BitNode *)malloc(sizeof(BitNode));
if(!BT) return ERROR;
BT->data=ch;
BinTreeCreat(BT->lchild);
BinTreeCreat(BT->rchild);
}
return OK;
}//BinTreeCreat
// 检查二叉树是否为空
Status BinTreeEmpty(BiTree BT)
{
if(BT==NULL) return OK;
return ERROR;
}//BinTreeEmpty
//按任一种遍历次序(包括按先序、中序、后序、按
//层次)输出二叉树中的所有结点,这里用先序遍历
void BinTraverse(BiTree BT) //这里用先序遍历法
{
if(BT){
printf("%c",BT->data);
BinTraverse(BT->lchild);
BinTraverse(BT->rchild);
}
}//BinTraverse
// 利用后序遍历法求二叉树的深度
int BinTreeDepth(BiTree BT)
{
int depl,depr;
if(BT){
depl=BinTreeDepth(BT->lchild);
depr=BinTreeDepth(BT->rchild);
if(depl>=depr)return depl+1;
else return depr+1;
}
else return ERROR;
}//BinTreeDepth
//求二叉树中所有结点数
int BinTreeCount(BiTree BT)
{
if(BT==NULL) return 0;
else return 1+BinTreeCount(BT->lchild)+BinTreeCount(BT->rchild);
}
//递归利用后序遍历法清除二叉树,使之变为空树
Status BinTreeClear(BiTree &BT)
{
if(BT){
BinTreeClear(BT->lchild);
BinTreeClear(BT->rchild);
BT=NULL;
free(BT);return OK;
}
}//BinTreeClear
int scan()
{
int d;
printf("1.初始化一棵二叉树 2.建立一棵二叉树\n");
printf("3.检查二叉树是否为空 4.按先序遍历二叉树\n");
printf("5.求二叉树的深度 6.求二叉树的结点个数\n");
printf("7.清除二叉树,使之为空 \n");
printf("3.其他键退出...........\n");
scanf("%d",&d);return d;
}//scan
void main()
{
int depth,count;
int quit=0;
BiTree BT;
while(!quit)
switch(scan())
{case 1:if(BinTreeInit(BT)) printf("初始化成功\n");break;
case 2:if(BinTreeCreat(BT)) printf("二叉树已建立\n");break;
case 3:if(BinTreeEmpty(BT))printf("二叉树为空\n");
else printf("二叉树不为空\n");break;
case 4:printf("二叉树的所有结点是:");
BinTraverse(BT);
printf("\n");
break;
case 5:depth=BinTreeDepth(BT);
printf("二叉树的深度为:%2d\n",depth);
break;
case 6:count=BinTreeCount(BT);
printf("二叉树的结点数是:%2d\n",count);
break;
case 7:if(BinTreeClear(BT))printf("二叉树已清空\n");
break;
case 0:quit=1;break;
}
}
在求深度的时候得到的结果是4,在求结点个数的时候得到的结果是6,不明白这是为什么?检查程序也不知道是什么错误
运行结果如下:
1.初始化一棵二叉树 2.建立一棵二叉树
3.检查二叉树是否为空 4.按先序遍历二叉树
5.求二叉树的深度 6.求二叉树的结点个数
7.清除二叉树,使之为空
3.其他键退出...........
1
初始化成功
1.初始化一棵二叉树 2.建立一棵二叉树
3.检查二叉树是否为空 4.按先序遍历二叉树
5.求二叉树的深度 6.求二叉树的结点个数
7.清除二叉树,使之为空
3.其他键退出...........
2
ABC##DE#G##F####
二叉树已建立
1.初始化一棵二叉树 2.建立一棵二叉树
3.检查二叉树是否为空 4.按先序遍历二叉树
5.求二叉树的深度 6.求二叉树的结点个数
7.清除二叉树,使之为空
3.其他键退出...........
5
二叉树的深度为: 6
1.初始化一棵二叉树 2.建立一棵二叉树
3.检查二叉树是否为空 4.按先序遍历二叉树
5.求二叉树的深度 6.求二叉树的结点个数
7.清除二叉树,使之为空
3.其他键退出...........
6
二叉树的结点数是: 8
1.初始化一棵二叉树 2.建立一棵二叉树
3.检查二叉树是否为空 4.按先序遍历二叉树
5.求二叉树的深度 6.求二叉树的结点个数
7.清除二叉树,使之为空
3.其他键退出...........
谁帮忙看看怎么会是这个结果呢?