我真的很想搞清楚这一点。 这是树:
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
问题: 创建一个函数来搜索上面给出的二叉树中的值。如果找到值,该函数应返回指向该节点的指针;否则该函数应返回空指针。参数应该是指向二叉树的根节点的指针和要搜索的值。
BinaryTree *search_for_val(BinaryTree *bt, int val)
{
if(!bt->isEmpty())
{
if(bt->getData() == val)
return bt;
else
return search_for_val(bt->right(), val);
return search_for_val(bt->left(), val);
}
}
我已成功创建了树,其他一切正常。就是这样。没有编译或运行时错误。我猜它的逻辑......我改变了很多次但看起来如果显示正确的节点,那么左边的节点就不会出现,反之亦然。请帮我。
非常感谢您的回复。我明白哪里出错了,感谢你的帮助。我还有另外一个问题......我本可以再次发布,但它与这个问题有点相关。如果这违反了发布规则,我真的很抱歉。如果是这样的话,我会把它拿下并重新发布。
问题:
我必须创建一个删除叶节点的函数。
该函数将获取指向二叉树的根节点的指针和要删除的值。如果函数中传递的值不是叶子,则函数应显示适当的消息。否则,该函数应删除具有该值的节点
void delete_val(BinaryTree *bt, int val)
{
BinaryTree *temp;
temp = search_val(bt, val);
//cout << " " << temp->left()->getData() << " " << temp->left()->getData() << endl;
if(temp->isLeaf())
{
delete temp;
cout << " Leaf " << temp->getData() << " deleted" << endl;
}
else { cout << " " << val << " is not a Leaf" << endl; }
}
我使用了您为search_val函数提供的答案来解决这个问题。问题是,当我想删除一个实际的叶子时,它仍会打印出它不是叶子。我认为它来自我的is_Leaf函数,但无法确切地指出错误。这是我的is_Leaf函数:
bool BinaryTree::isLeaf()
{
return ((this->leftTree == NULL) && (this->rightTree == NULL));
}
leftTree和rightTree是我的BinaryTree类的私有成员。你能看到什么吗?
感谢。
答案 0 :(得分:1)
如果bt
为空,则该函数缺少return语句。此外,由于return语句,未到达最后一个分支。如果bt
为null
,则该功能也可能会崩溃。这可以改变如下。
BinaryTree *search_for_val(BinaryTree *bt, int val)
{
BinaryTree* Result = null;
if( null != bt && !bt->isEmpty() )
{
if( bt->getData() == val )
{
Result = bt;
}
else
{
Result = search_for_val( bt->right(), val );
if ( null == Result )
{
Result = search_for_val( bt->left(), val );
}
}
}
return Result;
}
答案 1 :(得分:1)
您的逻辑永远不能搜索左侧树。如果右侧搜索失败,则需要返回左侧树。
BinaryTree *search_for_val(BinaryTree *bt, int val)
{
BinaryTree *result;
if(bt->isEmpty()) // Reverse sense of test.
result = nullptr;
else if (bt->getData() == val)
result = bt;
else
result = search_for_val(bt->right(), val);
if (result == nullptr)
result = search_for_val(bt->left(), val);
return result;
}