【问题标题】:Is it possible to add the nodes of Binary Search Tree to a hashset or hashmap是否可以将二叉搜索树的节点添加到哈希集或哈希图中
【发布时间】:2017-08-16 16:17:58
【问题描述】:

我们可以将 BST 的节点放在 HashMap 或 HashSet 中吗?如果是这样,我们如何遍历 BST。当我解决 TWO SUM BST 时出现了这个疑问。

【问题讨论】:

  • 那么,您到底在尝试什么?请给我们看代码
  • 这是问题给定一个二叉搜索树和一个目标编号,如果 BST 中存在两个元素且它们的总和等于给定目标,则返回 true。 . public boolean findTarget(TreeNode root, int k) { } 我实际上被卡住了。我计划将节点值添加到 HashSet。如果 HashSet 由 k` - node.value 组成,那么它将返回 true。

标签: java data-structures hashmap binary-search-tree hashset


【解决方案1】:

您可以将 BinarySearchTree 的节点放入 HashSet 或 HashMap(不确定 Map 的键值对是什么)。对于 HashSet,我将简单地按顺序遍历 BST。为了解决您遇到的问题,我会这样解决问题:

// Returns true if the BST contains two nodes with elements that
// sum to k, otherwise false
public bool findTarget(TreeNode root, int k){
    if(root == null){
        throw new NullPointerException();
    }
    HashSet<Integer> set = new HashSet<Integer>();
    return traverse(root, k, set);
}

// Traverses across the BST, in order, adding elements to the set
bool traverse(Node<T> node, int k, HashSet<Node<T>> set){
    // If the node has a left child, traverse it first
    if(node.left != null){
        return traverse(node.left, k, set);
    }
    // Check to see if the set contains the element that would sum
    // with the node we're checking's element to equal k
    if(set.contains(k-node.element)){
        return true;
    }
    // Add node's element to the set
    set.add(node.element);

    // If the node has a right child, traverse it after
    if(node.right != null){
        return traverse(node.right, k, set);
    }
    else{
        // No two node's with elements summing k exist in the BST,
        // since you reached the end and found nothing
        return false;
    }
}

【讨论】:

  • 谢谢!就可以了。
  • @Darth_dk 您可能需要注意这种算法的时间复杂度。由于 HashSet 的 O(1) add() 和 contains() 方法,traverse() 将被称为最坏情况 BST.size 次,并且每个 traverse() 内的复杂性将是恒定的。因此,如果您有兴趣,时间复杂度将是 O(BST.size)
【解决方案2】:

是的,你可以。二叉搜索树与其他任何数据一样具有数据,并且该数据可以存储到 Java 中的任何其他类型的集合中。在我告诉你如何遍历 BST 之前,让我解释一下它是什么,以防你不知道。

二叉搜索树是一种组织数据的方式。顶部节点通常称为根节点,任何小于它的数据都会放在它的左边,任何大于它的数据都会放在它的右边。这些称为它的子节点,而另一个节点称为父节点。例如,如果您的根为 2,则 1 将放在它的左侧,而 3 将放在右侧。但是,一个节点最多只能有2个孩子,左右分支的长度最多只能相差1。如果相差超过1,则需要进行一些交换。

要遍历树,必须首先从左分支开始。每往下一层,你必须首先检查节点是否有左孩子。如果是这样,则下降一级。继续往下走,直到没有剩下的孩子。这意味着这是最低值。上一层,把它作为你的下一个价值。如果它有一个合适的孩子,那就拿下一个。继续这个直到你找到根。接下来,扎根。最后,用同样的逻辑遍历右分支。转到第一个右孩子,只有在它没有左孩子的情况下才取。如果是这样,取最左边的孩子。然后带上父母。继续此操作,直到找到最右边的孩子,这将是您的最高值。

【讨论】:

    猜你喜欢
    • 2017-11-28
    • 2010-12-06
    • 2020-11-28
    • 2017-11-23
    • 1970-01-01
    • 2010-10-25
    • 2012-09-03
    • 2011-05-06
    • 2020-04-20
    相关资源
    最近更新 更多