合併二叉樹
給定兩個二叉樹,想象當你將它們中的一個覆蓋到另一個上時,兩個二叉樹的一些節點便會重疊。
你需要將他們合併爲一個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作爲節點合併後的新值,否則不爲 NULL 的節點將直接作爲新二叉樹的節點。
示例 1:
輸入:
Tree 1 Tree 2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7
輸出:
合併後的樹:
3
/ \
4 5
/ \ \
5 4 7
注意: 合併必須從兩個樹的根節點開始。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-two-binary-trees
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
代碼:
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
if (t1 == null && t2 == null) {//當兩個樹都爲空,終止
return null;
}
if (t1 == null) { //t1爲null,則把t2給t1,把t2這放到t1樹上
t1 = new TreeNode(t2.val);
t1.left = mergeTrees(null, t2.left);
t1.right = mergeTrees(null, t2.right);
} else if (t2 == null) { //t2爲null,直接遍歷t1
t1.left = mergeTrees(t1.left, null);
t1.right = mergeTrees(t1.right, null);
} else {//同時遍歷兩棵樹進行合併
t1.val = t1.val + t2.val;
t1.left = mergeTrees(t1.left, t2.left);
t1.right = mergeTrees(t1.right, t2.right);
}
return t1;
}
上面這塊代碼是第一次通過時的代碼邏輯(看了優化過的代碼,感覺特別糟糕,進行反思。。。。。。)。看來看去有些臃腫,之前寫算法,特別是關於遞歸的邏輯,很少優化,因爲本身代碼量就很少,邏輯就那幾句,就沒去在乎優化。
在做這道題的時候,看到有三個if條件,並遞歸方法寫了三遍,總共六行,肯定有些臃腫了,就想優化一下。
之前叫過兩位同學解過這道題,想看清一下自己的實力,是能力不足,還是做的不夠到位,順便加深印象,提升技術,可惜兩位同學沒有給到迴應。。。。。
下面記錄一下優化後的代碼:
public TreeNode mergeTreesRefactor(TreeNode t1, TreeNode t2) {
if (t1 == null && t2 == null) {
return null;
}
if (t1 == null) {
return t2;//這不就是t2麼,就不需要下面的遍歷了,t1已經結束了
}
if (t2 == null) {
return t1;//這不就是t1麼,就不需要下面的遍歷了,t2已經結束了
} else {
t1.val = t1.val + t2.val;
t1.left = mergeTreesRefactor(t1.left, t2.left);
t1.right = mergeTreesRefactor(t1.right, t2.right);
}
return t1;
}
結束!!!!