【问题标题】:Determine if an array will generate the same BST provided - Use Recursion确定数组是否会生成提供的相同 BST - 使用递归
【发布时间】:2020-02-18 03:38:08
【问题描述】:

我遇到了一些问题,问题如下:

Given a pre-constructed Binary Search Tree and an array, determine if the array will produce the same Binary Search Tree.

现在,这个问题会为你预先构建一个BST,然后它会运行下面的代码:

boolean valid = true;
for (int i = 0;valid && i < arr.length; i ++) {
   valid &= tree.checkPattern(arr[i]);
}

//These two methods below are in a different class. For every element in the array,
//the checkPattern method will be called, initially passing in the root of the BST
public void checkPattern(int key) {
   recursiveFunction(root, key);
}

public boolean recursiveFunction(TreeNode current, int key){
 // Recursive function 
}

目标是编写recursiveFunction(root, arr[i]),提示TreeNode 类包含一个visited 布尔值,您将使用它来帮助实现此算法。

我似乎不太明白如何解决这个问题...给定一个密钥,您是否应该检查它在主 BST 中的位置,如果已经访问过父级,则返回假的?

【问题讨论】:

  • 我的老师使用(用于 BFS 算法)步长/权重 1/2D(取决于地图类型)数组。这个数组只是充满了整数值(为方便起见,默认填充Integer.MAX_VALUE),这是到达那里的成本,代码将检查以这种方式或以前找到的方式遍历它是否更有效.
  • @FailingCoder BFS(广度优先搜索)与搜索 BST(二进制搜索树)有什么关系?在 BST 中,您可以直接沿着树向下走到您要查找的节点,每层只踩一个节点。 BFS 和 DFS(深度优先搜索)是关于遍历树中的每个节点。

标签: java recursion search tree binary


【解决方案1】:

一种方法是从数组中构建一个新的 BST,然后比较两棵树。想想如何一次构建一个节点的树。

现在,每个节点都有一个visited 标志,我们从所有标志为假开始,那么逻辑是:

  • 对于数组中的每个值,在树中查找该值的节点(目标节点):

    • 如果没有找到目标节点,则答案是否定的(树和数组的值不同)。

    • 如果到目标节点的路径踩到任何尚未访问过的节点,则答案是否定的(顺序错误)。

    • (可选)如果目标节点已经被访问过,则抛出IllegalArgumentException(数组中不允许重复值)。

    • 标记访问的目标节点。

  • 扫描树(BFS 或 DFS,无所谓),如果发现任何未访问的节点,则答案是否定的(树和数组的值不同)。

  • 如果你到了这里,答案是肯定的。

【讨论】:

  • 问你的后续问题,安德烈亚斯。关于逻辑树中的最后两点,这仅适用于 BST 的节点数多于数组生成的节点数的情况吗? (即它总是错误的,因为节点的数量不同)我很难找到一个边缘情况,否则我们会在逻辑中达到那个点 - 因为如果你碰到一个以前没有访问过的节点,你返回 false,否则,您认为您在正确的道路上。
  • @Bergis 如果您允许数组中有重复项(例如,您不执行可选步骤),则数组中的值数可能大于树中的节点数,所以不要t 依靠 count 来知道数组和/或树中是否有额外的值。
猜你喜欢
  • 2020-08-16
  • 2023-03-03
  • 2017-07-14
  • 1970-01-01
  • 2012-06-08
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多