【问题标题】:How to find all elements in an ordered dictionary implemented as a binary tree that have the key k如何在有序字典中查找所有元素,该字典实现为具有键 k 的二叉树
【发布时间】:2013-02-15 02:29:46
【问题描述】:

给定一棵二叉树,我需要实现一个方法 findAllElements(k) 来查找树中键等于 k ​​的所有元素。

我的想法是你第一次遇到带有键 k 的元素。所有具有相同键的元素都应该在左孩子的右子树或右孩子的左子树中。但有人告诉我可能不是这样?

我只需要找到一种实现算法的方法。所以需要伪代码。

我可能应该添加这个抱歉。但实现是左子树包含小于或等于根处的键的键,右子树包含大于或等于根处的键的键。

【问题讨论】:

  • 你需要一个算法,但你不明白你的树是什么样子的?
  • 是什么让你觉得我不明白我的树长什么样?
  • 好吧,如果你理解它,你就不会写“我被告知这可能不是这种情况”,你对帖子的编辑只会强制执行这个假设
  • 当时它是一个问题(因此是问号),因为我相信是这样的。如果您查看我在下面提供的答案,确实确实如此。我的老师似乎误解了我所说的。

标签: algorithm binary-search-tree


【解决方案1】:

查看当前节点。如果它的key大于k,则搜索左子树。如果它较低,则搜索右子树。如果相等,则搜索左右子树(并在结果中包括当前节点)。

从根节点开始递归执行。

【讨论】:

  • 不好的建议。假设它不仅仅是一棵二叉树,而是一棵 二叉搜索树(不确定 OP 是否理解其中的区别),必须明确定义重复项的存储,并且它要么在左子树中,要么在右子树中 - 它是具体的 BST 实现
  • 他没有说是“二叉搜索树”,而只是“二叉树”。
  • 如果它只是一个“二叉树”,那么你的答案是完全错误的,因为没有与通用二叉树的键关联的属性
  • @icepack,我觉得你可能会卡在“二叉树”的某个定义上,而事实上,同一个想法有各种各样的变体,人们仍然指的是作为“二叉树”。还有一些允许重复键的结构,并且重复可以出现在任一侧。想一想:某些类型的二叉树结构会在添加节点时自动重新平衡。通常,可以保证始终保持一定程度的平衡。如果允许重复键,这意味着它们必须有时出现在两边。
  • 刚刚注意到OP在他的问题中添加了一句话。它确认在他正在使用的树中,相等的键可以出现在左侧右侧。
【解决方案2】:

这取决于您的树实现,二叉树我假设您的意思是二叉搜索树,并且您使用 operator不小于(!

例如

  7 
 / \
4   7
   / \
  6   8

如果树中有多个相等的键,则执行此操作

k < current_node_key,  search left subtree
k > current_node_key,  search right subtree
k == current_node_key, record current node , then search right tree

【讨论】:

    【解决方案3】:

    我想我会在和老师交谈后回来解释结果应该是什么。因此,如果您执行一个 findElement(k) 方法,该方法将找到键等于 k ​​的元素,它找到的元素应该是键为 k 的树中最高的元素(让我们将此元素表示为 V)。

    然后从这个元素 V 开始,其他包含 key=k 的元素将要么在左子子树中(特别是一直到右边),要么在右子子树中(特别是一直到左边)。所以对于左孩子来说,继续到下一个节点右孩子,直到找到一个 key=k 的元素......现在......以这个节点为根的子树中的每个元素都必须有一个 key=k(这是我一开始没有认出的部分)因此可以对这个完整的子树进行任何类型的遍历以查找并存储该子树中的所有元素(访问其中的每个节点)。必须为右孩子重复这种类型的事情,但要访问每个左孩子,直到找到一个 key=k 的元素。则以该元素为根的子树包含所有其他 key=k 的元素,并且可以通过再次完全遍历该子树找到它们。

    这显然只是一个词的描述,对于长度和任何混淆感到抱歉。希望这将有助于其他尝试解决类似问题的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多