1. 程式人生 > >[LeetCode] 617. Merge Two Binary Trees

[LeetCode] 617. Merge Two Binary Trees

left treenode 生成 must 我沒 += lee 二叉樹 lap

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

Note: The merging process must start from the root nodes of both trees.

合並二叉樹,看到題就想到了遞歸版本的解法

整個過程分為
1.合並根節點
2.合並左子樹
3.合並右子樹

TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
    if (t1 == NULL && t2 == NULL)
    {
        return NULL;
    }
    if (t1 == NULL || t2 == NULL)
    {
        return t1 == NULL ? t2 : t1;
    }

    TreeNode* root = new TreeNode(t1->val + t2->val);

    root->left = mergeTrees(t1->left, t2->left);
    root->right = mergeTrees(t1->right, t2->right);

    return root;
}

再看看LeetCode的其他的寫法,直接使用傳進來的t1指針存儲生成的樹,生成的樹中的節點也是從t1t2中得到的,省下新建TreeNode的時間

從LeetCode上的提交來看,遞歸就是這個問題的最優解了,這是我沒想到的

TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2)
{
    if (!t1) return t2;
    if (!t2) return t1;

    t1->val += t2->val;
    t1->left = mergeTrees(t1->left, t2->left);
    t1->right = mergeTrees(t1->right, t2->right);

    return t1;
}

[LeetCode] 617. Merge Two Binary Trees