0x00 题目
给你一棵二叉树的根节点 root,翻转它。
0x01 思路
翻转,就是把左、右节点交换过来。
既然要交换,就不能只交换一个节点。
所以要交换全部,那就得遍历遍历 方式有:
深度优先:前序遍历,中序遍历,后序遍历
广度优先:层序遍历
然而,这里有一个坑,后面说…
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 invertTree(_ root: TreeNode?) -> TreeNode? {
// 节点为空,该回头了
guard let root = root else { return nil }
// 前序遍历代码 -> 见下面的具体代码
invertTree(root.left)
// 中序遍历代码 -> 见下面的具体代码
invertTree(root.right)
// 后序遍历代码 -> 见下面的具体代码
return root
}具体代码:
let node = root.left
root.left = root.right
root.right = node
// (root.left, root.right) = (root.right, root.left)
其中,上面所说的坑,就在中序遍历 的位置
中序遍历顺序是:左中右(左节点,根节点,右节点)
左:交换左节点的,左子节点与右子节点
中:交换,左节点换到右边去了
右:交换,其实是在操作左节点
最终,右节点没有进行交换
看!坑 就在这里
广度优先:
先把同一层的所有节点,都翻转了,再去下一层
func invertTree(_ root: TreeNode?) -> TreeNode? {
guard let root = root else {
return nil
}
var queue: [TreeNode] = [root]
while !queue.isEmpty {
// 用来保存下一层的节点
var tmp: [TreeNode] = []
while !queue.isEmpty {
let node = queue.removeFirst()
// 交换
(node.left, node.right) = (node.right, node.left)
if let left = node.left {
tmp.append(left)
}
if let right = node.right {
tmp.append(right
}
}
queue = tmp
}
return root
}小五笔
最强用户 1 天学会!敢来挑战?










