leetcode 653. Two Sum IV - Input is a BST
Given a Binary Search Tree and a target number, return true if there exist two elements in the BST such that their sum is equal to the given target.
Example 1:
Input: 5 / \ 3 6 / \ \ 2 4 7 Target = 9 Output: True
Example 2:
Input: 5 / \ 3 6 / \ \ 2 4 7 Target = 28 Output: False
解法1:使用dfs还原tree为一个sorted array,然后使用two sum算法求解。
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def findTarget(self, root, k): """ :type root: TreeNode :type k: int :rtype: bool """ # use DFS, transform tree to ordered array. def dfs(node, stack): if not node: return dfs(node.left, stack) stack.append(node.val) dfs(node.right, stack) stack = [] dfs(root, stack) i, j = 0, len(stack)-1 while i < j: if stack[i] + stack[j] == k: return True elif stack[i] + stack[j] > k: j -= 1 else: i += 1 return False
解法2:
上述算法使用迭代,
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def findTarget(self, root, k): """ :type root: TreeNode :type k: int :rtype: bool """ # use DFS, transform tree to ordered array. def dfs(node, arr): if not node: return stack = [] while node: stack.append(node) node = node.left while stack: node = stack.pop() arr.append(node.val) node = node.right while node: stack.append(node) node = node.left stack = [] dfs(root, stack) i, j = 0, len(stack)-1 while i < j: if stack[i] + stack[j] == k: return True elif stack[i] + stack[j] > k: j -= 1 else: i += 1 return False
解法3:
迭代tree,使用hash:
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def findTarget(self, root, k): """ :type root: TreeNode :type k: int :rtype: bool """ # use DFS, hash record accessed node. arr = set() def dfs(node, arr): if not node: return False if k-node.val in arr: return True arr.add(node.val) return dfs(node.left, arr) or dfs(node.right, arr) return dfs(root, arr)
Method 4.
The idea is to use binary search method. For each node, we check if k - node.val
exists in this BST.
Time Complexity: O(nlogn)
, Space Complexity: O(h)
. h
is the height of the tree, which is logn
at best case, and n
at worst case.
Java version:
public boolean findTarget(TreeNode root, int k) {
return dfs(root, root, k);
}
public boolean dfs(TreeNode root, TreeNode cur, int k){
if(cur == null)return false;
return search(root, cur, k - cur.val) || dfs(root, cur.left, k) || dfs(root, cur.right, k);
}
public boolean search(TreeNode root, TreeNode cur, int value){
if(root == null)return false;
return (root.val == value) && (root != cur)
|| (root.val < value) && search(root.right, cur, value)
|| (root.val > value) && search(root.left, cur, value);
}
解法5:从min到max迭代tree node,从max 到min迭代tree node:
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def findTarget(self, root, k): """ :type root: TreeNode :type k: int :rtype: bool """ # iterate tree node from min to max # iterate tree node from max to min # check two node of sum == k def add_node(stack, node, is_left=True): while node: stack.append(node) node = node.left if is_left else node.right if not root: return False stack1, stack2 = [], [] add_node(stack1, root, True) add_node(stack2, root, False) while stack1 and stack2: node1 = stack1[-1] node2 = stack2[-1] if node1 is node2: return False if node1.val + node2.val == k: return True elif node1.val + node2.val > k: node2 = stack2.pop() add_node(stack2, node2.left, False) else: node1 = stack1.pop() add_node(stack1, node1.right, True) return False
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2017-03-19 ubuntu 18.04 docker的安装和使用
2017-03-19 docker hub下载慢解决方法 使用daocloud的mirror
2017-03-19 wukong引擎源码分析之搜索——docid有序的数组里二分归并求交集,如果用跳表的话,在插入索引时会更快
2017-03-19 wukong引擎源码分析之索引——part 3 文档评分 无非就是将docid对应的fields信息存储起来,为搜索结果rank评分用
2017-03-19 golang defer使用——资源关闭时候多用
2017-03-19 wukong引擎源码分析之索引——part 2 持久化 直接set(key,docID数组)在kv存储里
2017-03-19 golang copy函数