617-Merge Two Binary Trees

kevin聰發表於2018-04-25

Description

Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not.

You need to merge them into a new binary tree. The merge rule is that if two nodes overlap, then sum node values up as the new value of the merged node. Otherwise, the NOT null node will be used as the node of new tree.


Example 1:

Input: 
    Tree 1                     Tree 2                  
          1                         2                             
         / \                       / \                            
        3   2                     1   3                        
       /                           \   \                      
      5                             4   7                  
Output: 
Merged tree:
         3
        / \
       4   5
      / \   \ 
     5   4   7

問題描述

給定兩個二叉樹, 你需要將它們合併, 兩個樹有些部分存在重疊。

合併的規則為, 如果兩個節點重疊, 將兩個節點的值之和作為新節點的值, 否則, 非空節點作為新節點


問題分析


解法1(遞迴)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
        if(t1 == null && t2 == null) return null;
        //若節點為空, 其值為0
        int val1 = (t1 == null ? 0 : t1.val), val2 = (t2 == null ? 0 : t2.val);
        //建立新節點
        TreeNode node = new TreeNode(val1 + val2);
        node.left = mergeTrees(t1 != null ? t1.left : null,t2 != null ? t2.left : null);
        node.right = mergeTrees(t1 != null ? t1.right : null,t2 != null ? t2.right : null);

        return node;
    }
}

解法2(stack)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public 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.isEmpty()){
            TreeNode[] t = stack.pop();
            if(t[0] == null || t[1] == null)    continue;
            t[0].val += t[1].val;
            if(t[0].left == null){
                t[0].left = t[1].left;
            }else{
                stack.push(new TreeNode[] {t[0].left, t[1].left});
            }
            if(t[0].right == null){
                t[0].right = t[1].right;
            }else{
                stack.push(new TreeNode[] {t[0].right, t[1].right});
            }
        }

        return t1;
    }
}

相關文章