📜  数据结构 |二叉搜索树 |问题 3(1)

📅  最后修改于: 2023-12-03 15:40:00.379000             🧑  作者: Mango

数据结构 - 二叉搜索树 - 问题3

什么是二叉搜索树 (Binary Search Tree)

二叉搜索树是一种常见的数据结构,它是一棵二叉树,其左子树的关键字都小于根节点的关键字,右子树的关键字都大于根节点的关键字。此外,二叉搜索树也满足左右子树都是二叉搜索树的条件。

在二叉搜索树中,搜索、插入和删除等操作的时间复杂度都是 O(log n)。

问题 3

给定一个二叉搜索树和一个值 k,判断该二叉搜索树中是否存在两个不同的节点,其节点值之和等于 k。

示例

输入:

root = [5,3,6,2,4,null,7]
k = 9

输出:

true

解释:

节点值为 2 的节点和节点值为 7 的节点之和等于 9。

解决方案

方法一:暴力枚举

该问题可以使用暴力枚举来解决。遍历整个二叉搜索树,寻找两个节点,它们的值之和等于 k。

时间复杂度:O(n^2)

class Solution:
    def findTarget(self, root: TreeNode, k: int) -> bool:
        def find(node, val):
            if not node:
                return False
            if node.val == val:
                return True
            elif node.val > val:
                return find(node.left, val)
            else:
                return find(node.right, val)

        def check(node, k):
            if not node:
                return False
            if find(root, k - node.val) and k - node.val != node.val:
                return True
            return check(node.left, k) or check(node.right, k)

        return check(root, k)

方法二:哈希表

将二叉搜索树中的每个节点的值放入哈希表中,然后再遍历一次二叉搜索树,对于每个节点,查找哈希表中是否存在值为 k - node.val 的值。

时间复杂度:O(n)

class Solution:
    def findTarget(self, root: TreeNode, k: int) -> bool:
        if not root:
            return False
        
        visited, stack = set(), [root]
        while stack:
            node = stack.pop()
            if k - node.val in visited:
                return True
            visited.add(node.val)
            if node.left:
                stack.append(node.left)
            if node.right:
                stack.append(node.right)
                
        return False
总结

本文介绍了二叉搜索树和问题 3 的解决方案。其中,方法一是暴力枚举,时间复杂度较高,方法二使用哈希表,时间复杂度较低。因此,我们应该尽可能地寻找时间复杂度较低的解决方案。