題解參考:
寫樹的遞迴,首先要想清楚使用二叉樹的哪種遍歷方式
本題需要對最下面的子節點進行操作,而且我們操作的只能是父節點,注意,操作父節點,所以,符合要求的只能是後序遍歷。
樹的遞迴操作,核心都是,在哪步操作根節點(就是合理選擇前中後序遍歷)
給你二叉樹的根結點 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來做填充,構成乙個完全二叉樹,具體的圖我就不畫了,大家自己理解一下。而我們需要自己手動把它轉換成...