Leetcode 617 - 合并二叉树

1 题目

https://leetcode-cn.com/problems/merge-two-binary-trees/

2 题意

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

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

示例 1:

输入: 
	   Tree 1                     Tree 2                  
          1                         2                             
         / \                       / \                            
        3   2                     1   3                        
       /                           \   \                      
      5                             4   7                  
输出: 
合并后的树:
	     3
	    / \
	   4   5
	  / \   \ 
	 5   4   7

注意: 合并必须从两个树的根节点开始。

3 思路

author's blog == http://www.cnblogs.com/toulanboy/

该题要求两棵树合并为一颗树。规则是对应位置合并。

思考点:

1、由于要对应位置合并,所以我们遍历二叉树时,需要让这2棵数在遍历过程中处于同一层次的同一个位置。

2、当两棵树,其中一颗树的该位置为空,但另外一棵树的该位置不空,则直接合并这个分支。

解决方案:

1、使用先序遍历,同时遍历时传递两棵树的根节点,让他们时刻处于同一层次(同一深度)。

2、遍历时额外标注其父亲是谁、标注当前树是其父亲的左孩子还是右孩子,方便处理思考点2,进行分支合并。

4 代码

//author's blog == http://www.cnblogs.com/toulanboy/
/**
 * 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:
    /*
    who: 标记其是父亲的左孩子,还是右孩子
       0  --> 左孩子;
       1  --> 右孩子
    
    */
    void merge(TreeNode * t1, TreeNode  * f1,TreeNode * t2, TreeNode * f2, int who){
        if(t1 == NULL && t2 == NULL){//如果2棵树都空,则不用合并
            return;
        }
        if(t1 == NULL){//如果t1空,t2不空。将t2合并到t1(挂靠在t1的父亲下)
            if(who == 0) //如果当前树是父亲的左子树
                f1->left = t2;//则挂在左边
            else
                f1->right = t2;
            return;
        }
        if(t2 == NULL){
            return;
        }
        t1->val += t2->val;//如果不是分支合并,则简单合并根节点数值
        merge(t1->left, t1, t2->left, t2, 0);//处理左子树
        merge(t1->right, t1, t2->right, t2, 1);//处理右子树
    }
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        //根节点没有父亲节点,额外处理
        if(t1 != NULL && t2 == NULL){
            return t1;
        }
        else if(t1 == NULL && t2 != NULL){
            return t2;
        }
        merge(t1, NULL, t2, NULL, -1);
        return t1;
    }
};
posted @ 2020-09-23 17:37  偷懒人  阅读(134)  评论(0编辑  收藏  举报