【发布时间】:2013-12-19 02:43:24
【问题描述】:
In this video (a section/recitation for an online course called CS50),大约 1h00m00s,学生导师进入指针到指针以及为什么更有效 有用以这种方式在二叉树上实现插入.至少,这是我从争论中得到的。
我以两种方式进行了递归实现。我不明白为什么选项 A 在下面比选项 B 更好...如果我被误解了,也许你可以帮我推理或指出正确的方向?
选项 A(带有指向指针的指针)
bool insert(int value, node* tree)
{
node** tmptree = &tree;
// make sure the tree itself isn't null
if(*tmptree != NULL)
{
if(value == (*tmptree)->value)
{
return false;
}
else if(value < (*tmptree)->value)
{
tmptree = &(*tmptree)->left;
// we must be at a null leaf!
if(*tmptree == NULL)
{
// make sure we built a leaf
*tmptree = build_node(value);
if(*tmptree == NULL)
{
return false;
}
return true;
}
else
{
return insert(value, *tmptree);
}
}
else
{
tmptree = &(*tmptree)->right;
if(*tmptree == NULL)
{
*tmptree = build_node(value);
if(*tmptree == NULL)
{
return false;
}
return true;
}
else
{
return insert(value, *tmptree);
}
}
}
return false; // if the tree is null
}
选项 B(常规 ptrs)
bool insert(int value, node* tree)
{
if(tree != NULL)
{
if(value == tree->value)
{
return false;
}
else if(value < tree->value)
{
if(tree->left == NULL)
{
node* tmp = build_node(value);
if(tmp != NULL)
{
tree->left = tmp;
return true;
}
return false;
}
else
{
return insert(value, tree->left);
}
}
else
{
if(tree->right == NULL)
{
node* tmp = build_node(value);
if(tmp != NULL)
{
tree->right = tmp;
return true;
}
return false;
}
else
{
return insert(value, tree->right);
}
}
}
return false; // if the tree is null
}
build_node 函数:
node* build_node(int value)
{
node* node = malloc(sizeof( node ));
if(node == NULL)
return NULL;
node->value = value;
node->left = NULL;
node->right = NULL;
return node;
}
【问题讨论】:
-
你的第二个实现根本不起作用。
-
你在哪里看到问题?
-
当一个值在 C 中作为参数传递时,它会被复制。所以这样做
node **tmptree = &tree;是没有用的,因为它指的是副本,而不是原始树。因此,当您使用修改副本的函数*tmptree = build_node (value);时,它不会向树中添加任何内容。如果要使用常规指针,则需要以 functional 样式实现。 -
使用缩进更好!
-
更准确地说,A 和 B 都是错误的。在这种情况下,指向本地指针的指针是毫无意义的。
标签: c pointers binary-tree cs50