• 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;
        }
    };
    
  • 相关阅读:
    LPC2138微控制器之定时器、看门狗、VIC实例
    Expression表达式目录树动态拼接 反射获取泛型方法
    泛型委托 Func<out T>,当返回的数据是一个匿名类型的时候该怎么办
    git stash与git commit的区别
    原码,补码,反码 和 有符合,无符号 整数知识总结
    二进制的 按位与、按位或、按位异、按位取反 的简单总结
    Asp.net MVC 中的TempData对象的剖析
    对Cookie和Session的理解
    MVC中IActionFilter过滤器俄罗斯套娃的实现方式
    分布式缓存
  • 原文地址:https://www.cnblogs.com/toulanboy/p/13719845.html
Copyright © 2020-2023  润新知