我已经成功从BST获得了最小的。但我想要的是从BST中获取最小元素忽略0值。例如:
我在BST中有这些值:
1.3,5.4,6.7,1.5,0
我需要函数返回1.3而不是0。
这些是我的代码:
template <class elemType>
elemType binaryTreeType<elemType>::find_min(nodeType<elemType> *p) const
{
elemType value = p->info;
nodeType<elemType> *left_node = p->lLink;
if (left_node != NULL)
{
elemType left_value = find_min(left_node);
if (left_value < value && left_value != 0)
value = left_value;
}
nodeType<elemType> *right_node = p->rLink;
if (right_node != NULL)
{
elemType right_value = find_min(right_node);
if (right_value < value && right_value != 0)
value = right_value;
}
return value;
}
答案 0 :(得分:0)
这就是我会这样做的方法(即使我仍然遇到函数定义的问题,如果elemType不是算术,或者如我的其中一条评论所述,那么树是空的)
/* is elemType always an arithmetic type? your question implies that
* you can compare a variable of type elemType to 0
*/
template <class elemType>
elemType binaryTreeType<elemType>::find_min(nodeType<elemType> *p) const
{
nodeType<elemType>* minNode = nullptr;
nodeType<elemType>* currentNode = p;
elemType value = p->info;
while(currentNode)
{
if(currentNode->info != 0)
{
minNode = currentNode;
currentNode = currentNode->left;
}
else
currentNode = currentNode->left?currentNode->left:currentNode->right;
/* if you accept a tree with several identical values,
* this line is incorrect (the update of minNode may also be,
* depending on which correction you choose)
*/
}
if(!currentNode)
{
// we have a problem here: there is no non-0 element in the tree!
return 0; // is that the behaviour you want?
}
return minNode->info();
}
另请注意,如果树可以多次存储相同的值,如果根包含0并且其左子树中的所有节点都包含0,则该函数可能不正确,在这种情况下,我看到三个解决方案:
- 在树的大小中写一个具有线性复杂度的函数
- 在每个节点中添加一个布尔值,说明其子节点之一是否包含非0节点,然后使用以下规则决定要探索的每个子树:如果存在且至少包含非0节点,则向左探索,否则探索正确(如果存在并且不包含至少非0节点且最小节点不为空,则可以停止计算)
- 确保每个左孩子严格小于其父