♥♥♥二叉樹題目的遞迴解法可以分兩類思路:
第一類是遍歷一遍二叉樹得出答案(回溯演算法核心框架)
第二類是通過分解問題計算出答案(動態規劃核心框架)
遇到一道二叉樹的題目時的通用思考過程是:
是否可以通過遍歷一遍二叉樹得到答案?如果不能的話,是否可以定義乙個遞迴函式,通過子問題(子樹)的答案推導出原問題的答案?
二叉樹遍歷框架:
void tr**erse(treenode root)
// 前序位置
tr**erse(root.left);
// 中序位置
tr**erse(root.right);
// 後序位置
}
前中後序是遍歷二叉樹過程中處理每乙個節點的三個特殊時間點,絕不僅僅是三個順序不同的 list:
前序位置的**在剛剛進入乙個二叉樹節點的時候執行;
後序位置的**在將要離開乙個二叉樹節點的時候執行;
中序位置的**在乙個二叉樹節點左子樹都遍歷完,即將開始遍歷右子樹的時候執行。
後序位置的特殊之處
中序位置主要用在 bst 場景中,你完全可以把 bst 的中序遍歷認為是遍歷有序陣列。
前序位置本身其實沒有什麼特別的性質,之所以你發現好像很多題都是在前序位置寫**,實際上是因為我們習慣把那些對前中後序位置不敏感的**寫在前序位置罷了。
後序位置和前序位置對比,發現前序位置的**執行是自頂向下的,而後序位置的**執行是自底向上的。這意味著前序位置的**只能從函式引數中獲取父節點傳遞來的資料,而後序位置的**不僅可以獲取引數資料,還可以獲取到子樹通過函式返回值傳遞回來的資料。
// 輸入一棵二叉樹的根節點,層序遍歷這棵二叉樹
void leveltr**erse(treenode root)
if (cur.right != null) }}
}
這裡面 while 迴圈和 for 迴圈分管從上到下和從左到右的遍歷:
bfs 演算法框架 就是從二叉樹的層序遍歷擴充套件出來的,常用於求無權圖的最短路徑問題。
多叉樹遍歷框架
/* 基本的 n 叉樹節點 */
class treenode
void tr**erse(treenode root)
n 叉樹的遍歷又可以擴充套件為圖的遍歷,因為圖就是好幾 n 叉棵樹的結合體。你說圖是可能出現環的?這個很好辦,用個布林陣列 visited 做標記就行了。
手把手帶你刷二叉樹(第一期) :: labuladong的演算法小抄
leetcode 二叉樹 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3 方法一 遞迴 思路 如果乙個樹的左子樹與右子樹映象對稱,則該樹是對稱的 兩個樹互為映象的...
LeetCode (二叉樹)反轉二叉樹
遞迴交換每乙個節點的左右子樹,重點在於訪問每乙個節點,然後交換左右子樹 definition for a binary tree node.struct treenode struct treenode inverttree struct treenode root 由於至少要講每乙個節點都訪問一次...
LeetCode 二叉樹1 樹的遍歷
note 後序遍歷在表示式上的應用 用遞迴的方式遍歷二叉樹 note 遞迴的實現方式裡,函式的返回值需要為void型別,否則沒法進行。所以我們需要設定乙個help函式來完成遞迴。後序遍歷 definition for a binary tree node.struct treenode class ...