#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct Node { char data; struct Node *LChild; struct Node *RChild; }BitNode,*BitTree; BitTree CreatBiTree(); bool PreOrder(BitTree bt); bool InOrder(BitTree bt); bool PostOrder(BitTree bt); int PostTreeDepth(BitTree bt); int main() { BitTree bt; int i; bt=CreatBiTree(); printf("请输入你要遍历的方式:"); scanf("%d\n",&i); if(i==-1) { PreOrder(bt); } else if(i==0) { PreOrder(bt); } else if(i==1) { InOrder(bt); } else { printf("无效方式!!\n"); } printf("此二叉树的深度是:"); PostTreeDepth(bt); return 0; } BitTree CreatBiTree() // 创建二叉树 { char data; BitTree bt; scanf("%c",&data); // 输入数据 if(data == '#')// 输入# 代表此节点下子树不存数据,也就是不继续递归创建 { return NULL; } else{ bt = (BitTree)malloc(sizeof(BitNode)); // 分配内存空间 bt->data = data; // 把当前输入的数据存入当前节点指针的数据域中 printf("请输入%s的左子树: ",data); bt->LChild = CreatBiTree(); // 开始递归创建左子树 printf("请输入%s的右子树: ",data); bt->RChild = CreatBiTree(); // 开始到上一级节点的右边递归创建左右子树 return bt; // 返回根节点 } } bool PreOrder(BitTree bt)//先序 { if(bt) { printf("%s\n",bt->data); PreOrder(bt->LChild); PreOrder(bt->RChild); } return true; } bool InOrder(BitTree bt)//中序 { if(bt) { InOrder(bt->LChild); printf("%s\n",bt->data); InOrder(bt->RChild); } return true; } bool PostOrder(BitTree bt)//后序 { if(bt) { PostOrder(bt->LChild); PostOrder(bt->RChild); printf("%s\n",bt->data); } return true; } int PostTreeDepth(BitTree bt)//深度 { int m,n; if(bt==NULL) return 0; else { m=PostTreeDepth(bt->LChild); n=PostTreeDepth(bt->RChild); if(m>n) return (m+1); else return (n+1); } }这段代码有什么问题
时间: 2023-06-20 07:09:01 浏览: 101
C语言实现密码本小项目
这段代码存在以下问题:
1. 在输入数据时,应该使用空格或换行符作为分隔符,而不是直接使用scanf("%c",&data),否则会出现输入缓存区中还有残留的回车符号,导致后续的输入被跳过。
2. 在遍历二叉树时,应该使用格式化输出符号%s,而不是%c,否则会输出字符的ASCII码值。
3. 在计算二叉树深度时,应该将左右子树的深度进行比较,而不是将左右子树的节点数进行比较。
下面是修改后的代码:
```
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Node {
char data;
struct Node *LChild;
struct Node *RChild;
}BitNode, *BitTree;
BitTree CreatBiTree();
bool PreOrder(BitTree bt);
bool InOrder(BitTree bt);
bool PostOrder(BitTree bt);
int PostTreeDepth(BitTree bt);
int main() {
BitTree bt;
int i;
bt = CreatBiTree();
printf("请输入你要遍历的方式(-1:先序遍历,0:中序遍历,1:后序遍历):");
scanf("%d", &i);
if (i == -1) {
PreOrder(bt);
}
else if (i == 0) {
InOrder(bt);
}
else if (i == 1) {
PostOrder(bt);
}
else {
printf("无效方式!!\n");
}
printf("此二叉树的深度是:%d\n", PostTreeDepth(bt));
return 0;
}
BitTree CreatBiTree() // 创建二叉树
{
char data;
BitTree bt;
scanf(" %c", &data); // 加入空格,避免读入回车符
if (data == '#') {
return NULL;
}
else {
bt = (BitTree)malloc(sizeof(BitNode));
bt->data = data;
printf("请输入%s的左子树: ", data);
bt->LChild = CreatBiTree();
printf("请输入%s的右子树: ", data);
bt->RChild = CreatBiTree();
return bt;
}
}
bool PreOrder(BitTree bt)//先序遍历
{
if (bt) {
printf("%c ", bt->data); // 修改输出格式
PreOrder(bt->LChild);
PreOrder(bt->RChild);
}
return true;
}
bool InOrder(BitTree bt)//中序遍历
{
if (bt) {
InOrder(bt->LChild);
printf("%c ", bt->data); // 修改输出格式
InOrder(bt->RChild);
}
return true;
}
bool PostOrder(BitTree bt)//后序遍历
{
if (bt) {
PostOrder(bt->LChild);
PostOrder(bt->RChild);
printf("%c ", bt->data); // 修改输出格式
}
return true;
}
int PostTreeDepth(BitTree bt)//深度
{
int leftDepth, rightDepth;
if (bt == NULL) {
return 0;
}
else {
leftDepth = PostTreeDepth(bt->LChild);
rightDepth = PostTreeDepth(bt->RChild);
return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1; // 修改深度计算方式
}
}
```
阅读全文