为什么BinTree tree无输出,而BinTree = NULL就有输出?

coverlo 2018-06-21 11:16:48
#include<stdio.h>
#include<stdlib.h>

typedef struct TreeNode* BinTree;
struct TreeNode{
int Data;
BinTree Left;
BinTree Right;
};

void Insert(BinTree* tree, int val); //向二叉树中插入数据
void DelTree(BinTree tree); //释放树节点
void PreOrderTraversal(BinTree tree); //先序遍历

int main(int argc, char* argv[])
{
BinTree tree = NULL;
Insert(&tree, 10);
Insert(&tree,8);
Insert(&tree,11);
Insert(&tree,7);
Insert(&tree,9);
Insert(&tree,15);
PreOrderTraversal(tree);
return 0;
}

void Insert( BinTree* tree, int val)
{
BinTree Temp = NULL; //这是一个零时节点
if(!(*tree)){ //如果树不为空
Temp = (BinTree)malloc(sizeof(struct TreeNode)); //为零时节点申请一个空间,并初始化
Temp->Data = val;
Temp->Left = NULL;
Temp->Right = NULL;
*tree = Temp; //将临时节点挂到树上
}

if(val<(*tree)->Data){ //如果这个数小于当前数,则插入左子树
Insert(&((*tree)->Left),val);
}else if(val>(*tree)->Data){ //如果这个数大于当前数,则插入右子树
Insert(&((*tree)->Right),val);
}
}

void DelTree(BinTree tree) //删除一个树得节点
...全文
149 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2018-06-21
  • 打赏
  • 举报
回复
因为,你注意看一下insert函数,若不是定义tree = NULL;那么传入insert中的tree就是随机值,就可能无法执行这个分支的逻辑:

if(!(*tree)){                            //如果树不为空 
Temp = (BinTree)malloc(sizeof(struct TreeNode)); //为零时节点申请一个空间,并初始化
Temp->Data = val;
Temp->Left = NULL;
Temp->Right = NULL;
*tree = Temp; //将临时节点挂到树上
}
coverlo 2018-06-21
  • 打赏
  • 举报
回复
在main函数的第一行是BinTree tree;的时候就无法正常输出,
改为BinTree tree = NULL;是就可以正常输出。
这是为什么?
coverlo 2018-06-21
  • 打赏
  • 举报
回复
void DelTree(BinTree tree)					//删除一个树得节点 
{
if(tree){ //非空才能free
free(tree->Left); //先free左节点,再free右节点,最后free根节点
free(tree->Right);
free(tree);
}
}

void PreOrderTraversal(BinTree tree)
{
if(tree){ //如果这个树不为空,则对他进行先序遍历
printf("%d ",tree->Data);
PreOrderTraversal(tree->Left);
PreOrderTraversal(tree->Right);
}
}
coverlo 2018-06-21
  • 打赏
  • 举报
回复
引用 3 楼 cfjtaishan 的回复:
因为,你注意看一下insert函数,若不是定义tree = NULL;那么传入insert中的tree就是随机值,就可能无法执行这个分支的逻辑:

if(!(*tree)){                            //如果树不为空 
Temp = (BinTree)malloc(sizeof(struct TreeNode)); //为零时节点申请一个空间,并初始化
Temp->Data = val;
Temp->Left = NULL;
Temp->Right = NULL;
*tree = Temp; //将临时节点挂到树上
}

谢谢,明白了

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧