云从 发表于 2017-3-5 21:07:23

关于二叉树的建立问题

//问题代码:
#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;
}

fc1735 发表于 2017-3-6 08:40:25

BiTree T=NULL;&T地址存放T
createBiTree(T);传入的是T的值
在函数里存放传进的T是在函数里的栈段中,修改此地址存放的值不会影响原本&T地址存放的值,函数返回后&T还是存放NULL

云从 发表于 2017-3-6 15:43:01

fc1735 发表于 2017-3-6 08:40
BiTree T=NULL;&T地址存放T
createBiTree(T);传入的是T的值
在函数里存放传进的T是在函数里的栈段中,修 ...

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

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

麻烦您了,谢谢

fc1735 发表于 2017-3-6 18:16:47

本帖最后由 fc1735 于 2017-3-6 18:18 编辑

云从 发表于 2017-3-6 15:43
那再请问一下,什么时候会改变原来T的值呢?

我一直以为只要参数是个指针型就会改变原来实参的值,可 ...
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);
    }
}

云从 发表于 2017-3-6 20:24:34

fc1735 发表于 2017-3-6 18:16


谢谢
页: [1]
查看完整版本: 关于二叉树的建立问题