【问题标题】:Find Closest Value in Binary Search Tree? [duplicate]在二叉搜索树中找到最接近的值? [复制]
【发布时间】:2021-12-30 00:44:18
【问题描述】:

我有这个算法结构问题;编写一个函数,接收一个 BST 和一个目标整数值,并将最近的值返回到 BST 中包含的目标值。

算法网站让我可以使用它;

function findClosestValueInBst(tree, target) {
  // Write your code here.
}

// This is the class of the input tree. Do not edit.
class BST {
  constructor(value) {
    this.value = value;
    this.left = null;
    this.right = null;
  }
}

我不是在寻求答案,但我如何在本地的 Visual Studio 代码中对此进行测试?我需要在函数的树/目标参数中传递什么值,以便我甚至可以测试事物或 console.log 事物?

我猜他们给了我一个示例输入但是..我怎么能把它记录到我的函数中来测试它?

  {
  "tree": {
    "nodes": [
      {"id": "10", "left": "5", "right": "15", "value": 10},
      {"id": "15", "left": "13", "right": "22", "value": 15},
      {"id": "22", "left": null, "right": null, "value": 22},
      {"id": "13", "left": null, "right": "14", "value": 13},
      {"id": "14", "left": null, "right": null, "value": 14},
      {"id": "5", "left": "2", "right": "5-2", "value": 5},
      {"id": "5-2", "left": null, "right": null, "value": 5},
      {"id": "2", "left": "1", "right": null, "value": 2},
      {"id": "1", "left": null, "right": null, "value": 1}
    ],
    "root": "10"
  },
  "target": 12
}

【问题讨论】:

    标签: javascript algorithm


    【解决方案1】:

    您需要构建有效的搜索树。

    首先执行操作Add(root, value)

    然后进行操作Find 寻找精确的重合,并进行SuccessorPredecessor 以获得比当前值更大或更小的最接近的值。

    然后提供值序列来制作一棵树(例如:6,3,9,0,15,5,7,14)并测试上述功能。

    要实现findClosestValueInBst,你可以修改Find的代码,但是当你发现元素不存在时(站在最后一片树叶上),调用SuccessorPredecessor函数中的一个来检查邻居并找到什么值接近目标。

    【讨论】:

      【解决方案2】:

      您可能想要构建自己的 BST(或几个)来测试您的代码。您可以手动构建它们,只需创建一堆节点并将它们链接在一起,或者编写一个插入函数将值传递给并构建您的树。如果您愿意,您可以使用一组值并在其上映射来构建节点。只需跟踪 BST 的根节点即可。

      然后使用您创建的 BST 的根和几个不同的目标值调用您的函数。查看您的函数是否返回您期望的值。尝试涵盖所有常见和边缘情况:

      目标恰好在树中:作为根节点、内部节点或叶节点;

      目标不在树中,而是在两个值之间(请参阅返回更接近的值);

      目标不在树中,并且大于或小于树中的所有内容(请参阅实际返回树中的最大值或最小值);

      在一个空的 BST、一个只有一个节点的 BST、有和没有重复值的 BST 中处理搜索

      编辑: 添加了一些样板代码以从值列表构建 BST,然后是如何将树传递给函数并记录输出的示例。还有一个将树打印到控制台的功能。它在它的一边,你必须想象链接,但它可能会有所帮助。祝你好运

      // This is the class of the input tree. Do not edit.
      class BST {
        constructor(value) {
          this.value = value;
          this.left = null;
          this.right = null;
        }
      }
      
      function findClosestValueInBst(tree, target) {
        // Write your code here.
      }
      
      // build a BST from an array of values and return the root
      function buildTree(values) {
        let root = null
        for (let value of values) root = insert(root, value)
        return root;
      }
      // insert a value into a BST
      function insert(root, value) {
        if (!root) return new BST(value)
        if (value < root.value) 
          root.left = insert(root.left, value)
        else 
          root.right = insert(root.right, value)
        return root
      }
      // display a binary tree
      function display(root, depth = 0) {
        if (!root) return;
        display(root.right, depth+1)
        console.log(`${'\t'.repeat(depth)}${root.value}`)
        display(root.left, depth+1)
      }
      
      const T1 = buildTree([
        10,  7,  2, 13, 10,  3,
         5, 12, 16, 23,  1, 20
      ])
      display(T1)
      
      // console.log(findClosestValueInBst(T1, 12)) // should return 12, because 12 is in T1
      // console.log(findClosestValueInBst(T1, 14)) // should return 13, as it's the closest to 14

      【讨论】:

      • 我提供了 BST 的示例输入,但我如何将它输入到我的函数中进行测试? ——
      • @dev:我认为您不了解左/右链接的工作原理。听从我的建议,使用现有代码。
      • @dev 示例输入看起来有点像 leetcode。它们的输入结构有点特殊,但是您编写的任何代码都必须符合提供的类接口(即,您的函数会传递一个带有值、左和右字段的根节点,您可以随意使用这些字段)。您可能不应该经常编写所有这些额外的代码来在 VSCode 中开发/测试在线算法问题:使用或添加到他们提供的测试用例并将 console.log 放在您正在实现的函数中以提供帮助会更容易你在那里调试
      • 但是我仍然在我的答案中添加了一些代码,以防您仍然想使用 VSCode 来解决这个问题
      【解决方案3】:

      提示:

      想想事情会如何出错。典型的错误是

      • 严重的编程错误(二进制搜索完全错误,拼写错误);

      • 微妙的限制情况(空树,单个节点的树,两个节点;相等的节点;目标等于一个节点,目标在中间;在少数节点上二分查找错误...)。

      对于每种情况,您如何检查?


      我建议不要只尝试几个测试用例,而是使用您知道必须在战略位置持有的断言来检测代码。例如,检查解决方案是否仍然在您考虑的子树中找到。

      还要确保实现在所有情况下都返回正确答案的防弹函数(效率无关紧要)。


      由于该练习似乎不是关于如何构建 BST,因此可以为这部分任务复制现有代码。确保来源可靠。 (为了双重安全,您可以验证构建的树。)

      【讨论】:

      • 我提供了一个 BST 输入示例,但我如何将它输入到我的函数中进行测试?
      猜你喜欢
      • 2021-01-28
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多