0x00 题目

给定一个二叉搜索树和一个目标结果
如果二叉搜索树中存在两个元素
且它们的和等于给定的目标结果,则返回 ​​​true​

粟子 ​​一​​:

    5
/ \
3 6
/ \ \
2 4 7

Target = 9
输出: ​​​True​

粟子 ​​二​​:

    5
/ \
3 6
/ \ \
2 4 7

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
}

公众号

一个有意思的公众号 😂

【二叉树】两数之和_ios