二叉樹遍歷

前中后序遍歷的區(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
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容