【问题标题】:Given a modified binary search tree, find k'th smallest element给定一个修改后的二叉搜索树,找到第 k 个最小的元素
【发布时间】:2011-11-11 07:48:39
【问题描述】:

假设在给定的二叉树中如果每个节点包含多个子元素,那么在树中找到第 k 个最小元素的最佳方法是什么?

请注意,这不是常规的 BST。每个节点都包含其下的子元素数量。

【问题讨论】:

  • 绝对不是功课。 @Skizz,我想给你看一次我的办公室徽章。 :)

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


【解决方案1】:
find_element(root, k)

    if(root.left.nchildren + 1 == k - 1) 
        return root;

    if(root.left.nchildren + 1 >= k)
        return find_element(root.left, k)             

    else 
        return find_element(root.right, k - (root.left.children + 1))

【讨论】:

  • @ajeet,西蒙娜:each node contains number of child elements。这包括右子树。如果您正在查找具有 n 个元素的完整二叉树中的第 n 个元素,此算法将错误地返回根。
  • @amit,请注意 Simone 计算的是 left.nchildren 而不是 root.nchildren。 Simone 从 0 开始计算 K。考虑到他的算法会返回正确的结果。
  • @ajeet:Simone 在我发表评论后编辑了答案,这个问题确实通过计算左子大小而不是根大小来解决。我的评论不再相关
  • @amit :知道了。 :) 同样在这种情况下,我在 30 秒的间隙内发布的答案确实是正确的。
【解决方案2】:

这是我得到的:

find (root, k)
{
leftChildCount = root->left->n
rightChildCount = root->right->n

if (leftChildCount+1 == k)
  Print root node
else if (k< leftChildCount)
  Find(root->left,k)
else
  Find(root->right,k-leftChildCount)
}

【讨论】:

    【解决方案3】:

    InOrder遍历方式遍历BST,并将元素存入数组。你的数组是一个排序数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      相关资源
      最近更新 更多