给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
示例 1:
输入: root = [5,3,6,2,4,null,7], k = 9
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum-iv-input-is-a-bst
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def findTarget(self, root, k):
"""
:type root: TreeNode
:type k: int
:rtype: bool
"""
#ordered_list = self.in_order(root)
#n = len(ordered_list)
self.having_set = set()
self.Found = False
# first good method
# for i in range(n):
# for j in range(i+1, n):
# if ordered_list[i] + ordered_list[j] == k:
# return True
# return False
# a bad method--unsbale to exclude itself
# set_result = set(ordered_list)
# for i in set_result:
# if k - i in set_result:
# return True
# return False
# second good method
# having_set = set()
# for i in ordered_list:
# if k-i in having_set:
# return True
# else:
# having_set.add(i)
# return False
self.in_order(root, k)
return self.Found
def in_order(self, root, k):
#边遍历边查找条件,能省空间和时间;比把树遍历完找出来要更简单
#本质思想跟在list中用set方法找是一样的,只不过这是遍历一遍树
if self.Found:
return#使用标志来判断是否需要结束递归,
#当前这种方法可以将递归结束在上一层
if root is None:#二叉搜索树
#无效节点,不用处理,返回进行下一步
#什么情况下会走到这一步呢?传进来的root是某一个父节点的空子节点
#这个父节点有另外一个有效孩子,只是不是当前这个孩子
return
if root.left is None and root.right is None:
#叶子节点了,往后走是继续下一层遍历,这里return就是不往下一层遍历了
if k-root.val in self.having_set:
print(k-root.val)
print(self.having_set)
self.Found = True
return#return这里容易忘
else:
self.having_set.add(root.val)
return
self.in_order(root.left, k)
middle_node = root.val
if k-middle_node in self.having_set:
self.Found = True
else:
self.having_set.add(middle_node)
self.in_order(root.right, k)