0x00 遍历方式
二叉树的遍历方式:
- 深度优先
- 广度优先
深度优先:
- 前序遍历:
中
左右 - 中序遍历:左
中
右 - 后序遍历:左右
中
广度优先:
- 层序遍历:遍历完同一层的所有节点后,继续往下层遍历
0x01 后序遍历
语言: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 postorder(_ root: TreeNode?) -> [Int] {
guard let root = root else { return [] }
var array = [Int]()
func dfs(_ root: TreeNode?) {
guard let root = root else { return }
dfs(root.left) // 左
dfs(root.right) // 右
array.append(root.val) // 中
}
dfs(root)
return array
}
迭代遍历:
需要手动维护一个栈
结构,而递归
方式有函数调用栈
func preorder(_ root: TreeNode?) -> [Int] {
guard let root = root else { return [] }
var array = [Int]()
var stack = [TreeNode]()
var t: TreeNode? = root
var pre: TreeNode? = nil // 记录前一个节点
while t != nil || !stack.isEmpty {
while t != nil { // 先左,一直到最下边
stack.append(t!) // 入栈
t = t!.left //再下一个 // 左
}
let node = stack.last! // 最后一个
if node.right == nil || node.right === pre {
array.append(node.val) // 添加 // 中
pre = node
t = nil
stack.removeLast() // 移除
}else{ // 进入右子树,开始新的一轮左子树遍历
t = node.right // 右
}
}
return array
}