鱼C论坛

 找回密码
 立即注册
查看: 3028|回复: 4

[已解决]关于二叉树的建立问题

[复制链接]
发表于 2017-3-5 21:07:23 | 显示全部楼层 |阅读模式

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

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

x
//问题代码:
#include <stdio.h>
#include<stdlib.h>

typedef char ElemType;

typedef struct BiTNode
{
    ElemType data;
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

//创建二叉树,按照前序遍历的方法输入
void createBiTree(BiTree T)
{

    char c;
    scanf("%c", &c);

    if('#' == c)
    {
        T = NULL;
    }
    else
    {
        T = (BiTNode *)malloc(sizeof(BiTNode));
        T->data = c;
                createBiTree(T->lchild);
                createBiTree(T->rchild);
    }
}

//递归遍历
void Travel(BiTree T)
{
    if(T)
    {
        printf("%c\n",T->data);
        Travel(T->lchild);
        Travel(T->rchild);
    }
}

int main()
{
    BiTree T=NULL;
    createBiTree(T);
    Travel(T);
    return 0;
}

请问一下,为什么当运行到Travel(T)的时候,显示T还是为空呢?
而当按照下面的方法来做,就是对的,,,请问一下区别在哪里?谢谢



//正确代码
#include <stdio.h>
#include<stdlib.h>

typedef char ElemType;

typedef struct BiTNode
{
    ElemType data;
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

//按前序遍历方法创建二叉树
BiTree createBiTree()
{
    BiTree T;
    char c;
    scanf("%c", &c);

    if('#' == c)
    {
        T = NULL;
    }
    else
    {
        T = (BiTNode *)malloc(sizeof(BiTNode));
        T->data = c;
        T->lchild = createBiTree();
        T->rchild = createBiTree();
    }
    return T;
}

//递归遍历
void Travel(BiTree T)
{
    if(T)
    {
        printf("%c\n", T->data);
        Travel(T->lchild);
        Travel(T->rchild);
    }
}

int main()
{
    BiTree T;
    T = createBiTree();
    Travel(T);

    return 0;
}
最佳答案
2017-3-6 18:16:47
本帖最后由 fc1735 于 2017-3-6 18:18 编辑
云从 发表于 2017-3-6 15:43
那再请问一下,什么时候会改变原来T的值呢?

我一直以为只要参数是个指针型就会改变原来实参的值,可 ...
  1. void createBiTree(BiTree *T)
  2. {

  3.     char c;
  4.     scanf("%c", &c);

  5.     if('#' == c)
  6.     {
  7.         *T = NULL;
  8.     }
  9.     else
  10.     {
  11.         *T = (BiTNode *)malloc(sizeof(BiTNode));
  12.         (*T)->data = c;
  13.                 createBiTree(&T->lchild);
  14.                 createBiTree(&T->rchild);
  15.     }
  16. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-6 08:40:25 | 显示全部楼层
BiTree T=NULL;&T地址存放T
createBiTree(T);传入的是T的值
在函数里存放传进的T是在函数里的栈段中,修改此地址存放的值不会影响原本&T地址存放的值,函数返回后&T还是存放NULL
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-6 15:43:01 | 显示全部楼层
fc1735 发表于 2017-3-6 08:40
BiTree T=NULL;&T地址存放T
createBiTree(T);传入的是T的值
在函数里存放传进的T是在函数里的栈段中,修 ...

那再请问一下,什么时候会改变原来T的值呢?

我一直以为只要参数是个指针型就会改变原来实参的值,可按照这一题,好像又不是这样?

麻烦您了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-6 18:16:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 fc1735 于 2017-3-6 18:18 编辑
云从 发表于 2017-3-6 15:43
那再请问一下,什么时候会改变原来T的值呢?

我一直以为只要参数是个指针型就会改变原来实参的值,可 ...
  1. void createBiTree(BiTree *T)
  2. {

  3.     char c;
  4.     scanf("%c", &c);

  5.     if('#' == c)
  6.     {
  7.         *T = NULL;
  8.     }
  9.     else
  10.     {
  11.         *T = (BiTNode *)malloc(sizeof(BiTNode));
  12.         (*T)->data = c;
  13.                 createBiTree(&T->lchild);
  14.                 createBiTree(&T->rchild);
  15.     }
  16. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-6 20:24:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 07:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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