Leetcode 1 二叉樹篇

2022-09-09 14:09:15 字數 1533 閱讀 7129

♥♥♥二叉樹題目的遞迴解法可以分兩類思路:

第一類是遍歷一遍二叉樹得出答案(回溯演算法核心框架)

第二類是通過分解問題計算出答案(動態規劃核心框架)

遇到一道二叉樹的題目時的通用思考過程是:

是否可以通過遍歷一遍二叉樹得到答案?如果不能的話,是否可以定義乙個遞迴函式,通過子問題(子樹)的答案推導出原問題的答案?

二叉樹遍歷框架:

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 ...