前中后序遍歷的區(qū)別:訪問根節(jié)點的先后順序。
遞歸遍歷注意點:注意遞歸結(jié)束的條件(一般是判斷節(jié)點==nil).
DFS:深度優(yōu)先策略
①注意空節(jié)點(為根節(jié)點或者葉子節(jié)點的下一層)
②注意葉子節(jié)點的處理
③處理當(dāng)前層需要處理的問題
④遞歸左右子樹
⑤有需要返回的return
BFS:廣度優(yōu)先策略
①注意根節(jié)點
②初始化第一層節(jié)點,加入隊列queue
③循環(huán)隊列(!queue.isempty),處理隊列節(jié)點,并判斷左右子節(jié)點是否為空,然后添加下一層節(jié)點到隊列,刪除當(dāng)前處理的節(jié)
自頂向下
①傳入當(dāng)前層節(jié)點與當(dāng)前層狀態(tài)(變量)
②空節(jié)點問題
③葉子節(jié)點問題
④下探入下一層的左右子樹,返回①
func pathSum(_ root: Node?, _ sum: Int) -> Bool {
if root == nil { return false }
if root?.left == nil && root?.right == nil {
return root?.val == sum
}
return pathSum(root?.left, sum - root!.val) || path(root?.right, sum - root!.val)
}
var ans = 0
// 每下探一層,深度加一
func maximun_d(_ node: TreeNode?, _ depth: Int) {
// 空節(jié)點,沒必要繼續(xù)下探
if node == nil { return }
// 下探到最底層,重新比較最大深度
if (node!.left == nil) && (node!.right == nil) {
ans = max(ans, depth)
}
maximun_d(node?.left, depth + 1)
maximun_d(node?.right, depth + 1)
}
maximun_d(root, 1)
return ans
自底向上
①空節(jié)點問題
②左右子樹遞歸探底
③計算初始問題,并返回結(jié)果
// 最大深度
func max_depth(_ root: Node?) -> Int {
// 空節(jié)點,(可能是空根節(jié)點或者葉子節(jié)點的下一層),返回0
if root == nil { return 0 }
var left_depth = 0, right_depth = 0, max_depth = 0
left_depth = maxi_depth(root?.left)
right_depth = maxi_depth(root?.right)
// 每次遞歸返回一層,深度加1
max_depth = max(left_depth, right_depth) + 1
return max_depth
// 或者
if root == nil { return 0 }
return max(maxDepth(root?.left), maxDepth(root?.right)) + 1
}