0x00 题目
给定一个二叉树,检查它是否是镜像对称的。
0x01 思路
对于二叉树的操作,一般都涉及到 遍历
遍历 的方式无非 2 种:
深度 优先:一般使用 递归 算法
广度 优先:一般使用 迭代 算法
判断是否是镜像,就要判断 左右 节点,以及节点的 值
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
}
}
递归方式:
当两个节点同时为空时,返回 true
当两个节点其中一个为空时,返回 false
两个节点相等时,递归 判断子节点
func isSymmetric(_ root: TreeNode?) -> Bool {
func isMirror(_ left: TreeNode?, _ right: TreeNode?) -> Bool {
// 同时为空
if left == nil && right == nil { return true }
// 一个为空
if left == nil || right == nil { return false }
// 相等了,走下一层
return (left?.val == right?.val) && isMirror(left?.left, right?.right) && isMirror(left?.right, right?.left)
}
return isMirror(root?.left, root?.right)
}
迭代方式:
操作方式是 一层一层 判断是否镜像对称
func isSymmetric_(_ root: TreeNode?) -> Bool {
func isMirror(_ left: TreeNode?, _ right: TreeNode?) -> Bool {
var queue: [TreeNode?] = []
queue.append(left)
queue.append(right)
while !queue.isEmpty {
let node1 = queue.removeFirst()
let node2 = queue.removeFirst()
if node1 == nil && node2 == nil {
continue // 进行后面节点的判断
}
if node1 == nil || node2 == nil {
return false // 有一个为空
}
if node1!.val != node2!.val {
return false // 值不相等
}
// 注意添加顺序
queue.append(node1?.left) // 左
queue.append(node2?.right) // 右
queue.append(node1?.right) // 右
queue.append(node2?.left) // 左
}
return true
}
return isMirror(root?.left, root?.right)
}
0x03 我的小作品
欢迎体验我的作品之一:小笔记-XNote
让笔记一步到位!
App Store 搜索即可~