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)
}
小笔记XNote
笔记从未如此方便~