我有这个find函数,它应该从我的树中返回一个值为val的节点,但它会丢失它要返回的节点,而是返回一个nullptr。这是为什么?
BinaryNode<int>* generalTree::find(int val, BinaryNode<int>* thisNode){
if(thisNode->getItem()==val){
return thisNode;
}
else{
BinaryNode<int>* left=find(val, thisNode->getLeftChildPtr());
BinaryNode<int>* right=find(val, thisNode->getRightChildPtr());
if(left->getItem()==val){
return left;
}
if(right->getItem()==val){
return right;
}
}
}
最初使用 rootPtr 进行调用 thisNode
答案 0 :(得分:1)
如果你看一下控制流程,基本问题就变得很明显了:
if (A)
return X;
else if(B)
return Y;
if (C)
return Z;
现在,如果A,B或C都不为真,会发生什么?执行流程结束,而不返回任何。这导致了不确定的行为。
你编写代码的方式也是不必要的(毫无意义)效率低下。如果未找到所需元素作为根,则搜索两个子树。这基本上意味着它将基本上搜索整个树,试图找到项目,而不是利用排序来有效地找到项目。至少在正常情况下,您希望比较项目以查找要搜索的树,因此在搜索的任何给定点,您只搜索可以(或可能)包含您正在查找的数据的一个子树对
答案 1 :(得分:0)
该函数不正确,因为没有检查使用(或返回)节点是否为NULL。
我会按照以下方式编写函数
BinaryNode<int>* generalTree::find(int val, BinaryNode<int>* thisNode)
{
if ( thisNode == nullptr || thisNode->getItem() == val ) return thisNode;
if ( val < thisNode->getItem() ) return find( val, thisNode->getLeftChildPtr() );
else return find( val, thisNode->getRightChildPtr() );
}