📅  最后修改于: 2023-12-03 15:40:00.379000             🧑  作者: Mango
二叉搜索树是一种常见的数据结构,它是一棵二叉树,其左子树的关键字都小于根节点的关键字,右子树的关键字都大于根节点的关键字。此外,二叉搜索树也满足左右子树都是二叉搜索树的条件。
在二叉搜索树中,搜索、插入和删除等操作的时间复杂度都是 O(log n)。
给定一个二叉搜索树和一个值 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 的解决方案。其中,方法一是暴力枚举,时间复杂度较高,方法二使用哈希表,时间复杂度较低。因此,我们应该尽可能地寻找时间复杂度较低的解决方案。