Leetcode刷題 114 二叉樹展開為鍊錶

2021-10-18 02:53:58 字數 1945 閱讀 2283

題解參考:

寫樹的遞迴,首先要想清楚使用二叉樹的哪種遍歷方式

本題需要對最下面的子節點進行操作,而且我們操作的只能是父節點,注意,操作父節點,所以,符合要求的只能是後序遍歷。

樹的遞迴操作,核心都是,在哪步操作根節點(就是合理選擇前中後序遍歷)

給你二叉樹的根結點 root ,請你將它展開為乙個單鏈表:

展開後的單鏈表應該同樣使用 treenode ,其中 right 子指標指向鍊錶中下乙個結點,而左子指標始終為 null 。

展開後的單鏈表應該與二叉樹 先序遍歷 順序相同。

示例 1:

輸入:root =[1

,2,5

,3,4

,null,6]

輸出:[

1,null,

2,null,

3,null,

4,null,

5,null,6]

示例 2:

輸入:root =

輸出:[

]示例 3:

輸入:root =[0

]輸出:[0]

樹中結點數在範圍 [0,

2000

] 內-

100<= node.val <=

100list

示例

根據題解中多次提到的,先給函式下乙個定義:

給flatten函式輸入乙個節點root,那麼以root為根的二叉樹就會被拉平為一條兩邊。

所以操作大致分為:

1、將root的左子樹和右子樹拉平

2、將root的右子樹接到左子樹下方,然後將整個左子樹作為右子樹

class

solution

(object):

defflatten

(self, root: treenode)

->

none

:if root is

none

:return

# 要清楚需要使用二叉樹的哪種遍歷方式

# 本題需要先更改子節點,所以使用後序遍歷框架

# 而且最重要的是,我們都是在遞迴彈回來的時候進行操作

# 此時操作的不是子節點,而是根節點。重要,而是根節點。

# 子節點沒法訪問父節點,所以,我們操作的是根節點

# 在圖中,操作的是,1 2 5 節點,這就是後序遍歷。

# 其他順序的遍歷核心也是,在哪步操作根節點,根節點,根節點。

self.flatten(root.left)

self.flatten(root.right)

# 後序遍歷位置

left = root.left

right = root.right

# 將左子樹變成右子樹

root.left =

none

root.right = left

'''疑問**

root.right.right = right

roo.right.right 不就是更改到右邊之後的left嗎

為什麼執行會報錯,說nonetype型別沒有attribute right呢

'''# 將原先的右子樹接到當前右子樹的末端

temp = root

while temp.right:

temp = temp.right

temp.right = right

其中有乙個疑問

以及思想很重要,遞迴思想,我們只需要寫基本步驟就行,不必關心它是怎麼實現的。

本題就是,將左子節點變成右子節點,然後右子節點接到左子節點的右邊。就ok了,遞迴上去它自然會實現,這種思想,需要時間培養一下。

LeetCode刷題筆記 114(涉及到二叉樹)

題目 二叉樹展開為鍊錶 給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 34 6將其展開為 1 2 3 4 5 6答案 1.展開為鍊錶的順序其實就是二叉樹的先序遍歷。1 將原來的右子樹接到左子樹的最右邊結點 2 將左子樹插入到右子樹的地方 3 根節點指向右子樹的根節點,重複 1 2...

LeetCode每日一題114 二叉樹展開為鍊錶

題目 給定乙個二叉樹,原地將他展開為乙個鍊錶 單向,右指標 如圖 方法1 前序遍歷遞迴 class solution preorder root public treenode preorder treenode root if right node null return root 方法2 前序遍...

LeetCode刷題助手 根據陣列生成二叉樹

大家在刷leetcode的二叉樹相關的題目的時候,遇到問題需要在本地ide裡除錯的時候,題目裡給的二叉樹的形式是乙個陣列,類似 integer array new integer 這種形式,它是以null來做填充,構成乙個完全二叉樹,具體的圖我就不畫了,大家自己理解一下。而我們需要自己手動把它轉換成...