二叉樹算法都是基于遞歸框架,我們要先搞清楚root節(jié)點(diǎn)他自己要做什么漆腌,然后根據(jù)題目要求選擇前序畔派,中序,后續(xù)的遞歸框架橡淆。
二叉樹的難點(diǎn)在于如何通過題目的的要求思考出每個節(jié)點(diǎn)需要做什么召噩。
寫遞歸算法的關(guān)鍵是要明確函數(shù)的定義是什么,然后相信這個定義逸爵,利用這個定義推到最終結(jié)果具滴,不要跳進(jìn)遞歸細(xì)節(jié)。
root該做什么师倔,什么時候做
/* 二叉樹遍歷框架 */
void traverse(TreeNode root) {
// 前序遍歷
traverse(root.left)
// 中序遍歷
traverse(root.right)
// 后序遍歷
}
多叉樹的遍歷
function traverse (root: TreeNode) {
for (const child of root.children) {
// 前序遍歷
traverse(child)
// 后序遍歷
}
}
前序遍歷和后序遍歷是兩個時間點(diǎn)
前序遍歷的代碼是在進(jìn)入某個node之前的那個時間點(diǎn)執(zhí)行构韵,
后續(xù)遍歷的代碼是在離開某個node之后的那個時間點(diǎn)執(zhí)行
這里聯(lián)想一下回溯:
回溯的偽代碼:
for 選擇 of 選擇列表 {
# 做選擇
將該選擇從列表中移除
路徑.add(選擇)
backtrack(路徑, 選擇列表)
# 撤銷選擇
路徑.remove(選擇)
將該選擇再加入選擇列表
}