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 inorder(_ 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) // 左
array.append(root.val) // 中
dfs(root.right) // 右
}
dfs(root)
return array
}
迭代遍历:
需要手动维护一个栈
结构,而递归
方式有函数调用栈
func inorder(_ root: TreeNode?) -> [Int] {
guard let root = root else { return [] }
var array = [Int]()
var stack = [TreeNode]()
var t: TreeNode? = root
while t != nil || !stack.isEmpty {
while t != nil { // 先左,一直到最下边
stack.append(t!) // 入栈
t = t!.left //再下一个 // 左
}
if !queue.isEmpty {
let node = queue.removeLast()
array.append(node.val) // 中
// 进入右子树,开始新的一轮左子树遍历
t = node.right // 右
}
}
return array
}