每天1题算法题(4)-合并二叉树 (√)

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

示例 1:

 解答

最简单也是最直接的,利用BFS递归实现

class Solution {
    public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
        if(t1 == null && t2 == null) {
            return null;
        }
        TreeNode treeNode = new TreeNode();
        if(t1 != null && t2 != null) {
            treeNode.val = t1.val + t2.val;
            treeNode.left = mergeTrees(t1.left, t2.left);
            treeNode.right = mergeTrees(t1.right, t2.right);
        }
        if(t1 != null && t2 == null) {
            treeNode.val = t1.val;
            treeNode.left = mergeTrees(t1.left, null);
            treeNode.right = mergeTrees(t1.right, null);
        }
        if(t1 == null && t2 != null) {
            treeNode.val = t2.val;
            treeNode.left = mergeTrees(null, t2.left);
            treeNode.right = mergeTrees(null, t2.right);
        }
        return treeNode;
    }
}

 官方简答

核心关键 

如果两棵树的当前节点均不为空,我们就将它们的值进行相加,并对它们的左孩子和右孩子进行递归合并;如果其中有一棵树为空,那么我们返回另一颗树作为结果;

public class Solution {
    public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
        if (t1 == null)
            return t2;
        if (t2 == null)
            return t1;
        t1.val += t2.val;
        t1.left = mergeTrees(t1.left, t2.left);
        t1.right = mergeTrees(t1.right, t2.right);
        return t1;
    }
}

进阶

利用迭代实现

class Solution {
    public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
        // 如果左树为空,直接返回右树
        if(t1 == null) {
            return t2;
        }
       Stack<TreeNode[]> stack = new Stack();
       stack.push(new TreeNode[]{t1,t2});
       while(stack.size() > 0) {
           TreeNode[] treeNodes = stack.pop();
           TreeNode tmpt1 = treeNodes[0];
           TreeNode tmpt2 = treeNodes[1];
           // 如果左数或右数为空,不需要合并,直接走下一个
            if(tmpt1 == null || tmpt2 == null) {
                continue;
            }
            // 合并
            tmpt1.val += tmpt2.val;
            // 如果左树的左分支为空,则返回右树的左分支
            if(tmpt1.left == null) {
                tmpt1.left = tmpt2.left;
            } else {
                // 否则将左树左分支和右树左分支加入处理
                stack.push(new TreeNode[]{tmpt1.left,tmpt2.left});
            }
            // 如果左树的右分支为空,则返回右树的右分支
            if(tmpt1.right == null) {
                tmpt1.right = tmpt2.right;
            } else {
                // 否则将左树右分支和右树右分支加入处理
                stack.push(new TreeNode[]{tmpt1.right,tmpt2.right});
            }
       }
       // 返回合并后的树
       return t1;

    }
}
原文地址:https://www.cnblogs.com/s648667069/p/13708241.html