leetcode-0617 合併二叉樹

題目地址https://leetcode-cn.com/problems/merge-two-binary-trees/java

1.遞歸解法

遞歸的話咱們首先須要遞歸的終止條件,對於本題而言,遞歸的終止條件是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;
};

2.DFS

這種解法以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;
};

3.BFS

這裏基本上是和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

相關文章
相關標籤/搜索