我对下面的code感到困惑:
struct node* newNode(int data)
{
struct node* node = (struct node*)
malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}
struct node* insert(struct node* node, int data)
{
/* 1. If the tree is empty, return a new,
single node */
if (node == NULL)
return(newNode(data));
else
{
/* 2. Otherwise, recur down the tree */
if (data <= node->data)
node->left = insert(node->left, data);
else
node->right = insert(node->right, data);
/* return the (unchanged) node pointer */
return node;
}
}
newNode
返回指向已分配的结构的指针。但是在insert
函数的第6行中,newNode
的返回值没有分配给任何东西,它只是被调用。代码如何能够进一步使用新创建的节点结构?
答案 0 :(得分:2)
如果树 NOT 为空,则下面的代码将运行。因此,当步骤.2中的代码运行时,步骤.1中的代码不会。
当递归展开时,您可以看到分配操作正在发生,例如:
node->left = insert(node->left, data);
哦,正如ThunderWiring所说,do not cast malloc!
答案 1 :(得分:0)
你拥有的是一棵有序的树。
您可以通过传递NULL指针来创建树,然后您将获得顶级节点。接下来,当您添加新项目时,它们将自动插入到正确的位置。但要注意树的结构将在很大程度上取决于插入顺序。
如果有效,因为在insert
函数的第6行,newNode
的返回值将返回给调用者。如果node最初是NULL,那么程序员应该创建一个顶级节点,如:
struct node *top = insert(NULL, data);
因此newNode
的返回值最终将分配给指针top
。
在现有树中插入值时,将向下递归树,直到找到其left
(resp。right
)字段中具有NULL的节点,并且新创建的节点将被分配给该(先前为NULL)字段。