从二进制搜索树中获取最小元素但忽略0

时间:2015-07-30 04:16:53

标签: c++ binary-search-tree

我已经成功从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;
}

1 个答案:

答案 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节点且最小节点不为空,则可以停止计算) - 确保每个左孩子严格小于其父