【问题标题】:Node with minimum value in a Binary Search Tree二叉搜索树中具有最小值的节点
【发布时间】:2014-02-02 06:49:21
【问题描述】:

我想找到最有效的方法来检查二叉搜索树中具有最小值的节点。我现在不打算用某种编程语言来做,我只想考虑最有效的算法。

您对此有何看法:

procedure minBST(t)
if (t = NULL) then return; 
if (t -> left = NULL) then return  t -> inf;  
 *// if the left node is null, then in a BST the smallest value will be the root*
if (t -> left != NULL) then .... 
 *// I need to dig more in the left side until I get the last left node*

我的问题是我应该如何深入挖掘,直到我得到最后一个左节点。 我也试图解释这些步骤。你认为这是最好的方法吗?

【问题讨论】:

  • 高效是什么意思。算法上,代码的详细程度,内存效率。最简单的方法是在途中最好地访问每个节点存储。见stackoverflow.com/questions/15306452/…
  • 效率 = 最小的复杂性。我已经看到了那个例子,但对我没有多大帮助。检查第一个左节点后,我需要了解如何深入。假设我有 10 个节点,我该怎么做?

标签: c++ c algorithm tree binary-search-tree


【解决方案1】:

下面的代码应该可以完成这项工作:

node* FindMin(node* n)
{
    if(n == NULL)
        return NULL;

    if(n->left == NULL)
        return n;

    while(n->left != NULL)
    {
        n = n->left;
    }

    return n;
}

复杂度是 O(log(n)),假设树是平衡的,你可以得到最好的结果。

【讨论】:

  • 第二个条件 if (n-> left == NULL) 不是必需的。如果删除它,则永远不会进入 while 循环,并且该函数将正确返回 n
【解决方案2】:

如果你有正确的 BST,你可以继续往下走左孩子:

     10
   /    \
  5      12
 / \    /  \
1   6  11  14

如果一个节点没有左孩子(Null),您知道您当前所在的节点具有最小值。 最简单的方法是通过递归:

int minBST(TreeNode node)
{
  if (node->left == Null)
    return node->value;
  else
    return minBST(node->left);
}

要开始搜索,只需调用上面的函数,并将根作为节点参数。 上面的树会有如下代码路径:

  • minBST(值为 10 的节点) -> 有左孩子 -> minBST(值为 5 的节点)
  • minBST(值为 5 的节点)-> 有左孩子 -> minBST(值为 1 的节点)
  • minBST(值为1的节点)->没有左孩子->返回1

如果您的树包含 n 个节点并且是平衡的(处处深度相等),这将需要 O(log_2 n) 次操作,并且是无需额外记账的最快方法。树的平衡对于获得最佳性能很重要,如果您想保持树的平衡,请查看红黑树。

【讨论】:

    【解决方案3】:

        public int MinValue(TreeNode root)
        {
            if (root == null)
            {
                return -1;
            }
    
            TreeNode node = root;
            while (node.Left != null)
            {
                node = node.Left;
            }
    
            return node.Value;
        }
    

    https://codestandard.net/articles/min-value-binary-search-tree

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      相关资源
      最近更新 更多