1. 程式人生 > >LeetCode 617. 合併二叉樹

LeetCode 617. 合併二叉樹

合併二叉樹

題目描述: 給定兩個二叉樹,想象當你將它們中的一個覆蓋到另一個上時,兩個二叉樹的一些節點便會重疊。 你需要將他們合併為一個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 NULL 的節點將直接作為新二叉樹的節點。

示例 1:

輸入: 
	Tree 1                     Tree 2                  
          1                         2                             
         / \                       / \                            
        3   2                     1   3                        
       /                           \   \                      
      5                             4   7                  
輸出: 
合併後的樹:
	     3
	    / \
	   4   5
	  / \   \ 
	 5   4   7
注意: 合併必須從兩個樹的根節點開始。

題目分析: 合併兩棵二叉樹,我們以第一棵二叉樹為基準,把第二棵樹合併到第一棵樹上面,我們用遞迴的方法來合併所有結點。 分三種情況來討論:

  1. 兩個結點都不為空,則把第二個結點的值加到第一個結點的值上,然後我們用遞迴函式來更新第一個結點的左子樹,再同理更新右子樹(遞迴函式的返回值為TreeNode*)。
  2. 其中一個結點為空,則返回另一個非空結點,例如t1為空,返回t2;t2為空,返回t1.
  3. 兩個結點都為空,則返回NULL。

程式碼如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution { public: TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) { if(!t1 && !t2) return NULL; else if(t1 && !t2) return t1; else if(!t1 && t2) return t2; else{ t1->val += t2->
val; t1->left = mergeTrees(t1->left, t2->left); t1->right = mergeTrees(t1->right, t2->right); return t1; } } };