【二叉树】两数之和
原创
©著作权归作者所有:来自51CTO博客作者haocold的原创作品,请联系作者获取转载授权,否则将追究法律责任
0x00 题目
给定一个二叉搜索树和一个目标结果
如果二叉搜索树中存在两个元素
且它们的和等于给定的目标结果,则返回 true
粟子 一
:
Target = 9
输出: True
粟子 二
:
Target = 28
输出: False
0x01 思路
思路 一
:
使用 Set
存储数值,遍历的同时,一边判断,一边添加
时间复杂度:O(N)
,要遍历所有元素
空间复杂度:O(N)
,set 要存储的个数,最坏情况 O(N)
思路 二
:
利用 BST
的性质,BST
的中序遍历结果是按升序排列的
利用 2
个指针 left
,right
,头尾遍历
left+right == k,返回 true
left+right < k,增大 left
left+right > k,减小 right
0x02 解法
语言:Swift
树节点:TreeNode
public class TreeNode {
public var val: Int
public var left: TreeNode?
public var right: TreeNode?
public init() { self.val = 0; self.left = nil; self.right = nil; }
public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
self.val = val
self.left = left
self.right = right
}
}
方法 一
:
func findTarget(_ root: TreeNode?, _ k: Int) -> Bool {
// 用集合存储数值
var set = Set<Int>()
// 查找方法
func find(_ root: TreeNode?, _ k: Int) -> Bool {
// 为空,返回 false
guard let root = root else { return false }
// 是否存在
if set.contains(k - root.val) { return true }
// 添加
set.insert(root.val)
// 继续往左、往右找
return find(root.left, k) || find(root.right, k)
}
return find(root, k)
}
方法 二
:
func findTarget(_ root: TreeNode?, _ k: Int) -> Bool {
// 存储结果
var arr: [Int] = []
// 中序遍历
func inorder(_ root: TreeNode?) {
if root == nil { return }
inorder(root?.left)
arr.append(root!.val)
inorder(root?.right)
}
inorder(root)
// 左、右索引
var left = 0
var right = arr.count - 1
while left < right {
// 和
let sum = arr[left] + arr[right]
// 相等,则找到
if sum == k { return true }
// 增大 left
else if sum < k { left += 1 }
// 减小 right
else { right -= 1 }
}
return false
}
公众号
一个有意思的公众号 😂
