鱼C论坛

 找回密码
 立即注册
查看: 3626|回复: 5

[已解决]关于创建树的问题,求鱼友们解答?

[复制链接]
发表于 2015-8-28 17:16:36 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef struct BiNode
  4. {
  5.         char data;
  6.         struct BiNode *lchild,*rchild;
  7. }BiNode,*BiTree;

  8. void preOrderTraverse(BiTree T);
  9. void creatTree(BiTree *tree);

  10. int main()
  11. {
  12.         BiTree tree1=NULL;
  13.         BiTree tree2=NULL;
  14.         printf("please enter the first tree:");
  15.         creatTree(&tree1);
  16.         printf("over");
  17.         preOrderTraverse(tree1);
  18.        

  19.         printf("\nplease enter the second tree:");
  20.         creatTree(&tree2);
  21.         printf("over");
  22.         preOrderTraverse(tree2);

  23.         return 0;
  24. }

  25. void preOrderTraverse(BiTree T)
  26. {
  27.         if(NULL==T)
  28.                 return;
  29.        
  30.         printf("%c",T->data);
  31.         preOrderTraverse(T->lchild);
  32.         preOrderTraverse(T->rchild);
  33. }

  34. void creatTree(BiTree *tree)
  35. {
  36.         char c;
  37.         scanf("%c",&c);

  38.         if(' '==c)
  39.         {
  40.                 *tree=NULL ;
  41.         }
  42.         else
  43.         {
  44.                 *tree=(BiTree)malloc(sizeof(BiNode));
  45.                 (*tree)->data=c;
  46.                 creatTree(&(*tree)->lchild);
  47.                 creatTree(&(*tree)->rchild);               
  48.         }
  49.         return;
  50. }
复制代码


为什么创建tree2的时候,如果输入和第一次一样的值结束不了递归,要多加两个“##”?
最佳答案
2015-9-9 00:57:19
指针引用错误,creatTree函数体中指针tred全部不需要解引用,你这个函数是不能创建树的,这个递归要输入空格才能结束,输入空格之后tree指向NULL了,所以函数返回后tree也是指向NULL
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-9-9 00:57:19 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
指针引用错误,creatTree函数体中指针tred全部不需要解引用,你这个函数是不能创建树的,这个递归要输入空格才能结束,输入空格之后tree指向NULL了,所以函数返回后tree也是指向NULL
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-9 01:20:11 From FishC Mobile | 显示全部楼层
我错了,其实我也是刚学的,你把creatTree函数中tree指针的解引用去掉就行了,creatTree函数调用格式改成creatTree(tree->lchild),在main函数中的调用改成creatTree(tree),因为指针tree本身就是一个地址,不需要&,手机打字可能有些错别字……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-9 01:25:49 From FishC Mobile | 显示全部楼层
看了一会才发现你那个createTree参数是一个双指针 彻底把我搞晕了,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-9 01:29:17 From FishC Mobile | 显示全部楼层
指针最好前面用一个小写的p,比如BiTree声明成pBiTree这样可读性高了很多哦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-9 20:38:57 | 显示全部楼层
样例输入:
1__ ("_"表示空格)
1__

这时,第一颗树只有一个节点,值为'1';
第二颗树在输入完后后两个节点,根节点为'\n',左儿子为'1',右儿子未输入。。。
原因是scanf()函数将回车给当成第二颗树的第一个节点值给接收了,解决方法是在每次建树完后加一个getchar();
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-18 21:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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