题目1: 530.二叉搜索树的最小绝对差
// 递归法
class Solution {
var res = Int.max
var preNode: TreeNode?
func getMinimumDifference(_ root: TreeNode?) -> Int {
recursiveMin(root)
return res
}
func recursiveMin(_ root: TreeNode?) {
guard let root else { return }
recursiveMin(root.left)
if let preNode {
res = min(res, root.val - preNode.val)
}
preNode = root
recursiveMin(root.right)
}
}
// 迭代法
class Solution {
var res = Int.max
var preNode: TreeNode?
func getMinimumDifference(_ root: TreeNode?) -> Int {
var stack: [TreeNode?] = [root]
while !stack.isEmpty {
let node = stack.removeLast()
if let node {
if let right = node.right { stack.append(right) }
stack.append(node)
stack.append(nil)
if let left = node.left { stack.append(left) }
} else {
let trueNode = stack.removeLast()
if let trueNode, let preNode { res = min(res, trueNode.val - preNode.val) }
preNode = trueNode
}
}
return res
}
}
题目2:501.二叉搜索树中的众数
// 递归法
class Solution {
var preNode: TreeNode?
var res = [Int]()
var maxCount = 0
var count = 0
func findMode(_ root: TreeNode?) -> [Int] {
bstRecursive(root)
return res
}
func bstRecursive(_ root: TreeNode?) {
guard let root else { return }
bstRecursive(root.left)
if let preNode {
if preNode.val == root.val {
count += 1
} else {
count = 0
}
}
preNode = root
if count == maxCount {
res.append(root.val)
}
if count > maxCount {
maxCount = count
res.removeAll()
res.append(root.val)
}
bstRecursive(root.right)
}
}
// 递归法
class Solution {
func findMode(_ root: TreeNode?) -> [Int] {
var stack: [TreeNode?] = [root]
var preNode: TreeNode?
var res = [Int]()
var count = 0
var maxCount = 0
while !stack.isEmpty {
let node = stack.removeLast()
if let node {
if let right = node.right { stack.append(right) }
stack.append(node)
stack.append(nil)
if let left = node.left { stack.append(left) }
} else {
let trueNode = stack.removeLast()
if let preNode, let trueNode {
if preNode.val == trueNode.val {
count += 1
} else {
count = 0
}
}
preNode = trueNode
if count == maxCount {
res.append(trueNode?.val ?? 0)
}
if count > maxCount {
maxCount = count
res.removeAll()
res.append(trueNode?.val ?? 0)
}
}
}
return res
}
}
题目3: 236. 二叉树的最近公共祖先
视频讲解真的很赞。
class Solution {
func lowestCommonAncestor(_ root: TreeNode?, _ p: TreeNode?, _ q: TreeNode?) -> TreeNode? {
if root == nil { return nil }
if root === p || root === q { return root }
let left = lowestCommonAncestor(root?.left, p, q)
let right = lowestCommonAncestor(root?.right, p, q)
if left != nil, right != nil { return root }
else if left == nil, right == nil { return nil }
else if left != nil { return left }
else { return right }
}
}