C++ 在树中搜索值
我真的很想弄明白这一点。 这是一棵树:C++ 在树中搜索值,c++,binary-tree,C++,Binary Tree,我真的很想弄明白这一点。 这是一棵树: 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1 问题: 创建一个函数来搜索上面给出的二叉树中的值。如果找到值,函数应该返回指向该节点的指针;否则,函数应返回空指针。参数应该是指向二叉树根节点的指针和要搜索的值 BinaryTree *search_for_va
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; }
}
leftTree和rightTree是我的BinaryTree类的私有成员。你能看到什么吗
谢谢。如果
bt
为空,则函数缺少返回语句。此外,由于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;
}
你的逻辑永远无法在左树下搜索。如果右搜索失败,则需要返回左树
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;
}
这仍然是错误的<代码>返回搜索值(bt->left(),val)代码>永远无法执行。@MartinBonner谢谢你的评论,我刚刚注意到。@IgorR。当然可以。你确定
| |
?a | | b
的结果是bool
。
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;
}