tag10:樹 反轉(zhuǎn)二叉樹和合并二叉樹

leetcode226. 翻轉(zhuǎn)二叉樹

翻轉(zhuǎn)一棵二叉樹。

示例:

輸入:

? ? 4

? /? \

? 2? ? 7

/ \? / \

1? 3 6? 9

輸出:

? ? 4

? /? \

? 7? ? 2

/ \? / \

9? 6 3? 1

(1)遞歸寫法:

關(guān)鍵點是對換當(dāng)前根節(jié)點的左右節(jié)點和遞歸當(dāng)前根節(jié)點的左右節(jié)點:

class?Solution:

????def?invertTree(self,?root:?TreeNode)?->?TreeNode:

????????if?not?root:

????????????return?

? ? ? ? tmp=root.left

????????root.left=root.right

????????root.right=tmp

????????self.invertTree(root.left)?

????????self.invertTree(root.right)

????????return?root

(2)迭代寫法

關(guān)鍵點:對換節(jié)點和不斷引入右左節(jié)點,以及每次遍歷一層,寬度優(yōu)先遍歷

class?Solution:

????def?invertTree(self,?root:?TreeNode)?->?TreeNode:

????????if?not?root:

????????????return?

????????d1=[root]

????????while?d1:

????????????for?i?in?range(len(d1)):

????????????????t=d1.pop(0)

????????????????tmp=t.right

????????????????t.right=t.left

????????????????t.left=tmp

????????????????if?t.left:

????????????????????d1.append(t.left)

????????????????if?t.right:

????????????????????d1.append(t.right)

????????return?root

leetcode617. 合并二叉樹

給定兩個二叉樹,想象當(dāng)你將它們中的一個覆蓋到另一個上時,兩個二叉樹的一些節(jié)點便會重疊。

你需要將他們合并為一個新的二叉樹。合并的規(guī)則是如果兩個節(jié)點重疊,那么將他們的值相加作為節(jié)點合并后的新值,否則不為?NULL 的節(jié)點將直接作為新二叉樹的節(jié)點。

示例?1:

輸入:

Tree 1? ? ? ? ? ? ? ? ? ? Tree 2? ? ? ? ? ? ? ? ?

? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? 2? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? / \? ? ? ? ? ? ? ? ? ? ? / \? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? 3? 2? ? ? ? ? ? ? ? ? ? 1? 3? ? ? ? ? ? ? ? ? ? ? ?

? ? ? /? ? ? ? ? ? ? ? ? ? ? ? ? \? \? ? ? ? ? ? ? ? ? ? ?

? ? ? 5? ? ? ? ? ? ? ? ? ? ? ? ? ? 4? 7? ? ? ? ? ? ? ? ?

輸出:

合并后的樹:

? ? 3

? ? / \

? 4? 5

? / \? \

5? 4? 7

注意:?合并必須從兩個樹的根節(jié)點開始。

(1)遞歸寫法

關(guān)鍵點是比較節(jié)點和遞歸左右節(jié)點

代碼如下:

class?Solution:

????def?mergeTrees(self,?t1:?TreeNode,?t2:?TreeNode)?->?TreeNode:

????????t=TreeNode()?????

????????if?not?t1?and?not?t2:

????????????return???????

????????if?not?t1?or?not?t2:

????????????if??t1:

????????????????t=t1

????????????if??t2:

????????????????t=t2??????

????????if??t1?and?t2:

????????????t.val=t1.val+t2.val

????????????t.left=self.mergeTrees(t1.left,t2.left)

????????????t.right=self.mergeTrees(t1.right,t2.right)??????

????????return?t

(2)迭代寫法

關(guān)鍵點:

1)一個隊列的元素中包含左右樹,先進行值加操作,確定都不為空添加,然后為空時如下:

2)判斷左樹為空,將右樹值賦給左樹

class?Solution:

????def?mergeTrees(self,?t1:?TreeNode,?t2:?TreeNode)?->?TreeNode:

????????if?not?(t1?and?t2):

????????????if?not?t1:

????????????????return?t2

????????????if?not?t2:

????????????????return?t1

????????queue?=?[(t1,t2)]

????????while?queue:

????????????r1,r2?=?queue.pop(0)

????????????r1.val?+=?r2.val

????????????#?如果r1和r2的左子樹都不為空,就放到隊列中

????????????#?如果r1的左子樹為空,就把r2的左子樹掛到r1的左子樹上

????????????if?r1.left?and?r2.left:

????????????????queue.append((r1.left,r2.left))

????????????elif?not?r1.left:

????????????????r1.left?=?r2.left

????????????#?對于右子樹也是一樣的

????????????if?r1.right?and?r2.right:

???????????????queue.append((r1.right,r2.right))

????????????elif?not?r1.right:

????????????????r1.right?=?r2.right

????????return?t1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容