題目地址https://leetcode-cn.com/problems/merge-two-binary-trees/java
遞歸的話咱們首先須要遞歸的終止條件,對於本題而言,遞歸的終止條件是t1和t2遞歸到任意一方爲null的狀況,由於這種條件下,咱們不須要繼續合併下去,直接返回不爲null那一方便可。總體遞歸的過程就比較簡單了,分爲三個步驟git
算法總體的時間複雜度爲O(n) 空間複雜度爲O(h) 其中h爲二叉樹的最大深度github
var mergeTrees = function(t1, t2) { if (t1 == null) return t2; if (t2 == null) return t1; const newRoot = new TreeNode(t1.val + t2.val); newRoot.left = mergeTrees(t1.left, t2.left); newRoot.right = mergeTrees(t1.right, t2.right); return newRoot; };
這種解法以t1爲基準,直接在t1上面操做,最終將t1返回。時間複雜度O(n) 空間複雜度O(n)。算法
var mergeTrees = function(t1, t2) { if (t1 === null) return t2; if (t2 === null) return t1; const stack = [[t1, t2]]; while (stack.length > 0) { let [a, b] = stack.pop(); // 若是b爲null,那不管a是否爲空,a都不須要作出改變 if (b === null) continue; a.val = a.val + b.val; // 下面處理a和b的子節點 // 若是a的左孩子或者右孩子爲null,那直接將其賦值爲b的左孩子或者右孩子 if (a.left === null) a.left = b.left; else stack.push([a.left, b.left]) if (a.right === null) a.right = b.right else stack.push([a.right, b.right]) } return t1; };
這裏基本上是和DFS同樣,由於不須要在乎遍歷的順序,只須要將每一個節點都遍歷到,所以也可使用BFS。時間複雜度O(n) 空間複雜度O(n)。數據結構
class Solution { public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { Queue<TreeNode[]> queue = new LinkedList<>(); if (t1 == null) return t2; if (t2 == null) return t1; queue.offer(new TreeNode[]{t1, t2}); while (!queue.isEmpty()) { TreeNode[] t = queue.poll(); if (t[1] == null) continue; t[0].val += t[1].val; if (t[0].left == null) t[0].left = t[1].left; else queue.offer(new TreeNode[]{t[0].left, t[1].left}); if (t[0].right == null) t[0].right = t[1].right; else queue.offer(new TreeNode[]{t[0].right, t[1].right}); } return t1; } }
更多LeetCode題解和數據結構方面的內容,能夠關注個人github,求個star~ ▄█▔▉●code