鱼C论坛

 找回密码
 立即注册
查看: 2467|回复: 12

[已解决]无法创建第二棵二叉树

[复制链接]
发表于 2023-3-1 17:13:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdarg.h>
  4. #include<iostream>
  5. #include<iterator>
  6. using namespace std;
  7. #define TElemType char
  8. #define Status int
  9. #define SUCCESS 1
  10. #define ERROR -1
  11. #define OVERFLOW -2
  12. //二叉树的二叉链表存储表示
  13. typedef struct BitNode
  14. {
  15.         TElemType data;
  16.         struct BitNode* lchild, * rchild;
  17. }BiTNode, * BiTree;
  18. //构造空二叉树
  19. Status InitBiTree(BiTree& T) {
  20.         T = NULL;
  21.         return 1;
  22. }
  23. /*
  24.   销毁二叉树T
  25. */
  26. Status DestroyBiTree(BiTree& T) {
  27.         if ((T)->lchild)
  28.                 DestroyBiTree(T->lchild);
  29.         if ((T)->rchild)
  30.                 DestroyBiTree(T->rchild);
  31.         free(T);
  32.         T = NULL;
  33.         return 1;
  34. }
  35. /*
  36. * 先序队列创建二叉树
  37. */
  38. Status CreateBiTree(BiTree& S) {
  39.         TElemType ch2;
  40.         scanf("%c", &ch2);
  41.         if (ch2 == ' ')
  42.                 S = NULL;
  43.         else
  44.         {
  45.                 S = (BiTree)malloc(sizeof(BiTNode));
  46.                 if (!S)
  47.                         exit(OVERFLOW);
  48.                 S->data = ch2;
  49.                 CreateBiTree(S->lchild);
  50.                 CreateBiTree(S->rchild);
  51.         }
  52.         return SUCCESS;
  53. }
  54. int main(void) {
  55.         BiTree biTree = NULL, insertBiTree = NULL;
  56.         int initResult = InitBiTree(biTree);
  57.         printf("initResult=%d\n", initResult);
  58.         int createBiTree = CreateBiTree(biTree);
  59.         printf("createBiTree=%d\n", createBiTree);
  60.         int insertCreateResult = CreateBiTree(insertBiTree);
  61.         printf("insertCreateBiTree=%d\n", insertCreateResult);
  62. }
复制代码

测试数据:ABC##DE#G##F###
#为空格
第一棵树可以正常创建
第二棵树按回车无反应
最佳答案
2023-3-1 18:36:42
dolly_yos2 发表于 2023-3-1 18:21
错误的,fflush(stdin) 是不标准的写法,它可能工作也可能不工作,应该避免这种用法

学到了
  1. fseek(stdin,0,SEEK_SET);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-3-1 17:17:04 | 显示全部楼层

回帖奖励 +10 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-3-1 17:43:27 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-1 17:53:24 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-1 18:19:27 | 显示全部楼层
  1. int main(void) {
  2.         BiTree biTree = NULL, insertBiTree = NULL;
  3.         int initResult = InitBiTree(biTree);
  4.         printf("initResult=%d\n", initResult);
  5.         int createBiTree = CreateBiTree(biTree);
  6.         printf("createBiTree=%d\n", createBiTree);
  7.         fflush(stdin);///////////////////
  8.         int insertCreateResult = CreateBiTree(insertBiTree);
  9.         printf("insertCreateBiTree=%d\n", insertCreateResult);
  10. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 2

使用道具 举报

发表于 2023-3-1 18:19:45 | 显示全部楼层
前言,试图反对这种四不像的写法:写 C 就好好写 C,写 C++ 就好好写 C++
问题:scanf("%c", ...) 不会忽略任何字符,包括第一棵树输入后的换行符,而这一符号并未被过滤,因此成为了第二棵树的根节点,导致后续输入的节点数量不够,看起来像“按回车后无反应”,实际上是程序仍在等待输入
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-3-1 18:21:36 | 显示全部楼层

错误的,fflush(stdin) 是不标准的写法,它可能工作也可能不工作,应该避免这种用法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-1 18:36:42 | 显示全部楼层    本楼为最佳答案   
dolly_yos2 发表于 2023-3-1 18:21
错误的,fflush(stdin) 是不标准的写法,它可能工作也可能不工作,应该避免这种用法

学到了
  1. fseek(stdin,0,SEEK_SET);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-1 18:47:17 | 显示全部楼层
dolly_yos2 发表于 2023-3-1 18:19
前言,试图反对这种四不像的写法:写 C 就好好写 C,写 C++ 就好好写 C++
问题:scanf("%c", ...) 不会忽 ...

教材上都是伪码,参着C和CPP写的,所以四不像了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-1 18:48:43 | 显示全部楼层
homeskating 发表于 2023-3-1 18:47
教材上都是伪码,参着C和CPP写的,所以四不像了

可能这就是命吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-1 18:51:41 | 显示全部楼层

这个方法好像也是很经典的,不过似乎也不够令人满意,因为 stdin 并不一定 seekable。我的测试结果显示这并不能移除多余的换行符,而 fseek 返回了 -1 表示调用失败
测试:
  1. #include <stdio.h>
  2. int main(){
  3.     int i;
  4.     char c;
  5.     scanf("%d", &i);
  6.     printf("%d\n", i);
  7.     printf("%d\n", fseek(stdin, 0, SEEK_SET));
  8.     scanf("%c", &c);
  9.     printf("%u\n", (unsigned int)c);
  10.     return 0;
  11. }
复制代码
输入:
  1. 12<回车>
复制代码
输出:
  1. 12
  2. -1
  3. 10
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-1 19:00:27 | 显示全部楼层
dolly_yos2 发表于 2023-3-1 18:51
这个方法好像也是很经典的,不过似乎也不够令人满意,因为 stdin 并不一定 seekable。我的测试结果显示这 ...

试试
  1. ((FILE *)stdin)->_cnt=0;
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-1 19:12:58 | 显示全部楼层

这个方法太魔法了,同样不值得提倡。我会用 fgets 或者 fgetc/ungetc 实现过滤
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 04:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表