天天看點

【計題01組03号】LeetCode——二叉樹

寫在前面:部落格推行版本更新,成果積累制度,已經寫過的部落格還會再次更新,不斷地琢磨,高品質高數量都是要追求的,工匠精神是學習必不可少的精神。是以,大家有何建議歡迎在評論區踴躍發言,你們的支援是我最大的動力,你們敢投,我就敢肝

二叉樹的前序周遊

給你二叉樹的根節點 root ,傳回它節點值的 前序 周遊。

示例 1:

輸入:root = [1,null,2,3]

輸出:[1,2,3]

示例 2:

輸入:root = []

輸出:[]

示例 3:

輸入:root = [1]

輸出:[1]

示例 4:

輸入:root = [1,2]

輸出:[1,2]

示例 5:

輸入:root = [1,null,2]

提示:

樹中節點數目在範圍 [0, 100] 内

-100 <= Node.val <= 100

進階:遞歸算法很簡單,你可以通過疊代算法完成嗎?

二叉樹的中序周遊

給定一個二叉樹的根節點 root ,傳回它的 中序 周遊。

輸出:[1,3,2]

輸出:[2,1]

二叉樹的後序周遊

給定一個二叉樹,傳回它的 後序 周遊。

示例:

輸入: [1,null,2,3]  

   1

    \

     2

    /

   3 

輸出: [3,2,1]

進階: 遞歸算法很簡單,你可以通過疊代算法完成嗎?

二叉樹的層序周遊

給你一個二叉樹,請你傳回其按 層序周遊 得到的節點值。 (即逐層地,從左到右通路所有節點)。

示例:

二叉樹:[3,9,20,null,null,15,7],

    3

   / \

  9  20

    /  \

   15   7

傳回其層序周遊結果:

[

  [3],

  [9,20],

  [15,7]

]

二叉樹的最大深度

給定一個二叉樹,找出其最大深度。

二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。

說明: 葉子節點是指沒有子節點的節點。

給定二叉樹 [3,9,20,null,null,15,7],

傳回它的最大深度 3 。

對稱二叉樹

給定一個二叉樹,檢查它是否是鏡像對稱的。

例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。

    1

  2   2

 / \ / \

3  4 4  3

但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的:

   \   \

   3    3

進階:

你可以運用遞歸和疊代兩種方法解決這個問題嗎?

路徑總和

給你二叉樹的根節點 root 和一個表示目标和的整數 targetSum 。判斷該樹中是否存在 根節點到葉子節點 的路徑,這條路徑上所有節點值相加等于目标和 targetSum 。如果存在,傳回 true ;否則,傳回 false 。

葉子節點 是指沒有子節點的節點。

輸入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22

輸出:true

解釋:等于目标和的根節點到葉節點路徑如上圖所示。

輸入:root = [1,2,3], targetSum = 5

輸出:false

解釋:樹中存在兩條根節點到葉子節點的路徑:

(1 --> 2): 和為 3

(1 --> 3): 和為 4

不存在 sum = 5 的根節點到葉子節點的路徑。

輸入:root = [], targetSum = 0

解釋:由于樹是空的,是以不存在根節點到葉子節點的路徑。

從中序與後序周遊序列構造二叉樹

根據一棵樹的中序周遊與後序周遊構造二叉樹。

注意:

你可以假設樹中沒有重複的元素。

例如,給出

中序周遊 inorder = [9,3,15,20,7]

後序周遊 postorder = [9,15,7,20,3]

傳回如下的二叉樹:

從前序與中序周遊序列構造二叉樹

給定一棵樹的前序周遊 preorder 與中序周遊  inorder。請構造二叉樹并傳回其根節點。

示例 1:

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]

Output: [3,9,20,null,null,15,7]

示例 2:

Input: preorder = [-1], inorder = [-1]

Output: [-1]

提示:

1 <= preorder.length <= 3000

inorder.length == preorder.length

-3000 <= preorder[i], inorder[i] <= 3000

preorder 和 inorder 均無重複元素

inorder 均出現在 preorder

preorder 保證為二叉樹的前序周遊序列

inorder 保證為二叉樹的中序周遊序列

填充每個節點的下一個右側節點指針

給定一個 完美二叉樹 ,其所有葉子節點都在同一層,每個父節點都有兩個子節點。二叉樹定義如下:

struct Node {

  int val;

  Node *left;

  Node *right;

  Node *next;

}

填充它的每個 next 指針,讓這個指針指向其下一個右側節點。如果找不到下一個右側節點,則将 next 指針設定為 NULL。

初始狀态下,所有 next 指針都被設定為 NULL。

你隻能使用常量級額外空間。

使用遞歸解題也符合要求,本題中遞歸程式占用的棧空間不算做額外的空間複雜度。

輸入:root = [1,2,3,4,5,6,7]

輸出:[1,#,2,3,#,4,5,6,7,#]

解釋:給定二叉樹如圖 A 所示,你的函數應該填充它的每個 next 指針,以指向其下一個右側節點,如圖 B 所示。序列化的輸出按層序周遊排列,同一層節點由 next 指針連接配接,'#' 标志着每一層的結束。

樹中節點的數量少于 4096

-1000 <= node.val <= 1000

填充每個節點的下一個右側節點指針II

給定一個二叉樹

輸入:root = [1,2,3,4,5,null,7]

輸出:[1,#,2,3,#,4,5,7,#]

解釋:給定二叉樹如圖 A 所示,你的函數應該填充它的每個 next 指針,以指向其下一個右側節點,如圖 B 所示。序列化輸出按層序周遊順序(由 next 指針連接配接),'#' 表示每層的末尾。

樹中的節點數小于 6000

-100 <= node.val <= 100

二叉樹的最近公共祖先

給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。

百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個節點 p、q,最近公共祖先表示為一個節點 x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個節點也可以是它自己的祖先)。”

輸入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1

輸出:3

解釋:節點 5 和節點 1 的最近公共祖先是節點 3 。

輸入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4

輸出:5

解釋:節點 5 和節點 4 的最近公共祖先是節點 5 。因為根據定義最近公共祖先節點可以為節點本身。

輸入:root = [1,2], p = 1, q = 2

輸出:1

樹中節點數目在範圍 [2, 105] 内。

-109 <= Node.val <= 109

所有 Node.val 互不相同 。

p != q

p 和 q 均存在于給定的二叉樹中。

二叉樹的序列化與反序列化

序列化是将一個資料結構或者對象轉換為連續的比特位的操作,進而可以将轉換後的資料存儲在一個檔案或者記憶體中,同時也可以通過網絡傳輸到另一個計算機環境,采取相反方式重構得到原資料。

請設計一個算法來實作二叉樹的序列化與反序列化。這裡不限定你的序列 / 反序列化算法執行邏輯,你隻需要保證一個二叉樹可以被序列化為一個字元串并且将這個字元串反序列化為原始的樹結構。

提示: 輸入輸出格式與 LeetCode 目前使用的方式一緻,詳情請參閱 LeetCode 序列化二叉樹的格式。你并非必須采取這種方式,你也可以采用其他的方法解決這個問題。

輸入:root = [1,2,3,null,null,4,5]

輸出:[1,2,3,null,null,4,5]

樹中結點數在範圍 [0, 104] 内

-1000 <= Node.val <= 1000

在黑夜裡夢想着光,心中覆寫悲傷,在悲傷裡忍受孤獨,空守一絲溫暖。

我的淚水是無底深海,對你的愛已無言,相信無盡的力量,那是真愛永在。

我的信仰是無底深海,澎湃着心中火焰,燃燒無盡的力量,那是忠誠永在