请教个二叉树插入数据方面的问题.

Woodz 2013-06-05 10:17:46
以下是之前我们老师讲的二叉树插入数据时的操作, 数据小则插入左边, 大则右边. 疑问我写到注释里, 求解惑.


// 节点
struct node_st
{
datatype data;
struct node_st *l;
struct node_st *r;
};

int insert(struct node_st **root, datatype *x)
{
struct node_st *node;

if(*root == NULL)
{
node = malloc(sizeof(*node));
// 如果申请内存失败...
if(node == NULL)
return -1;
node->data = *x;
node->l = node->r = NULL;
*root = node; // 为什么还要有这步操作? 只是为了将插入节点的地址带回去?
return 0;
}

if(*x <= (*root)->data)
return insert(&(*root)->l, x); // 为什么是 &(*root)->l? 等价于 (&(*root))->l?
return insert(&(*root)->r, x);
}
...全文
122 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2013-06-06
  • 打赏
  • 举报
回复
引用 3 楼 free4537 的回复:
[quote=引用 1 楼 Idle_Cloud 的回复:] 为什么还要有这步操作? 只是为了将插入节点的地址带回去? 是的,就是要吧指针地址取回去,所以参数也是用了指针的指针 为什么是 &(*root)->l? 等价于 (&(*root))->l? 不是,等价于&((*root)->l)要指针的指针嘛,所以要取左指针的地址。
引用 2 楼 FancyMouse 的回复:
>为什么还要有这步操作? 只是为了将插入节点的地址带回去? 空树变成有单个节点的树,根节点会从根变成那个节点。不写这句话的话,调用者的root一直是NULL。
感觉 root 一直在变似的... 每次插入是 *root 在变? [/quote] 那段代码外面有个if(*root==NULL)包着
michael2988 2013-06-06
  • 打赏
  • 举报
回复
你的第一个问题说的没错,是要把root带回,因为此时插入的是树的第一个结点。 第二个问题
&(*root)->l
等价于
&((*root)->l)
,二叉树的左右子树还是二叉树,如果小于根构造左子树,否则构造右子树。
Woodz 2013-06-06
  • 打赏
  • 举报
回复
引用 1 楼 Idle_Cloud 的回复:
为什么还要有这步操作? 只是为了将插入节点的地址带回去? 是的,就是要吧指针地址取回去,所以参数也是用了指针的指针 为什么是 &(*root)->l? 等价于 (&(*root))->l? 不是,等价于&((*root)->l)要指针的指针嘛,所以要取左指针的地址。
引用 2 楼 FancyMouse 的回复:
>为什么还要有这步操作? 只是为了将插入节点的地址带回去? 空树变成有单个节点的树,根节点会从根变成那个节点。不写这句话的话,调用者的root一直是NULL。
感觉 root 一直在变似的... 每次插入是 *root 在变?
FancyMouse 2013-06-06
  • 打赏
  • 举报
回复
>为什么还要有这步操作? 只是为了将插入节点的地址带回去? 空树变成有单个节点的树,根节点会从根变成那个节点。不写这句话的话,调用者的root一直是NULL。
Carl_CCC 2013-06-05
  • 打赏
  • 举报
回复
为什么还要有这步操作? 只是为了将插入节点的地址带回去? 是的,就是要吧指针地址取回去,所以参数也是用了指针的指针 为什么是 &(*root)->l? 等价于 (&(*root))->l? 不是,等价于&((*root)->l)要指针的指针嘛,所以要取左指针的地址。

69,371

社区成员

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

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