生活随笔
收集整理的這篇文章主要介紹了
leetcode 617. 合并二叉树 思考分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
給定兩個二叉樹,想象當你將它們中的一個覆蓋到另一個上時,兩個二叉樹的一些節點便會重疊。
你需要將他們合并為一個新的二叉樹。合并的規則是如果兩個節點重疊,那么將他們的值相加作為節點合并后的新值,否則不為 NULL 的節點將直接作為新二叉樹的節點。
思路1:遞歸遍歷兩棵樹,構造一棵新的樹
1、遞歸參數以及返回值
返回值:新樹的結點
參數:兩棵舊樹
2、終止條件
兩棵舊樹的對應的該結點都為NULL
3、邏輯(這里直接貼代碼和遇到的問題)
首先將情況分為4類:
如果t1 和t2 都是空結點,那么說明新樹的這個結點也是NULL
如果t1 t2中一個位空一個不為空,我們可以直接將其中不為空的一個結點的信息直接傳給新結點
如果t1 t2全部存在,那么將結點值相加,傳給新結點。
注意當進行遞歸調用traversal時:
如traversal(t1->left,t2->left);:必須要保證t1、t2都不為空,否則編譯器會報錯。
member access within null pointer of type 'TreeNode'
class Solution {
public:TreeNode
* traversal(TreeNode
* t1
, TreeNode
* t2
){if(t1
== NULL && t2
== NULL) return NULL;int rootVal
=0;if(t1
==NULL && t2
!=NULL) {rootVal
= t2
->val
;TreeNode
* NewRoot
= new TreeNode(rootVal
);NewRoot
->left
= t2
->left
;NewRoot
->right
= t2
->right
;return NewRoot
;}else if(t1
!=NULL && t2
==NULL){rootVal
= t1
->val
;TreeNode
* NewRoot
= new TreeNode(rootVal
);NewRoot
->left
= t1
->left
;NewRoot
->right
= t1
->right
;return NewRoot
;} else{rootVal
= t1
->val
+ t2
->val
;TreeNode
* NewRoot
= new TreeNode(rootVal
);NewRoot
->left
= traversal(t1
->left
,t2
->left
);NewRoot
->right
= traversal(t1
->right
,t2
->right
);return NewRoot
;} }TreeNode
* mergeTrees(TreeNode
* t1
, TreeNode
* t2
) {return traversal(t1
,t2
);}
};
思路2:層序遍歷兩棵樹,構造一棵新的樹
在LeetCode 101. 對稱二叉樹 思考分析中,有過利用隊列同時遍歷兩棵樹的經歷,這里回顧了一下,然后直接上。
這里完全是基于t1來的,當不重疊的時候,直接將t2的結點直接作為t1的節點,結點與孩子的關系也被傳給t1了。
class Solution {
public:TreeNode
* mergeTrees(TreeNode
* t1
, TreeNode
* t2
) {if(t1
== NULL && t2
==NULL) return NULL;else if(t1
== NULL && t2
!=NULL) return t2
;else if(t1
!= NULL && t2
==NULL) return t1
;queue
<TreeNode
*> que
;que
.push(t1
); que
.push(t2
); while(!que
.empty()) {TreeNode
* T1Node
= que
.front();que
.pop();TreeNode
* T2Node
= que
.front();que
.pop();T1Node
->val
+= T2Node
->val
;if(T1Node
->left
&& T2Node
->left
){que
.push(T1Node
->left
);que
.push(T2Node
->left
);}if(T1Node
->right
&& T2Node
->right
){que
.push(T1Node
->right
);que
.push(T2Node
->right
);}if(!T1Node
->left
&& T2Node
->left
){T1Node
->left
= T2Node
->left
;}if(!T1Node
->right
&& T2Node
->right
){T1Node
->right
= T2Node
->right
;}} return t1
;}
};
總結
以上是生活随笔為你收集整理的leetcode 617. 合并二叉树 思考分析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。