/* 
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. 
*//**

 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
struct TreeNode* mergeTrees(struct TreeNode* t1, struct TreeNode* t2) {

}

*/

题意:合并两个二叉树。规则是,对应的两个结点如果有重叠就求和(比如更改val),如果不重叠就使用非空的结点的值。(不考虑树释放的问题。)

办法1

* 把t2并到t1,最终返回t1。

* 记录t1,作为最终的返回。进入递归函数。

* 如果t1与t2都不为空,此时需要递归:

   * 求和,更改t1->val。

   * 左子树递归,并把结果赋值给t1->left。

   * 右子树递归,并把结果赋值给t1->right。

   * 返回t1。

* 否则,结束递归,返回t1?t1:t2。

* 注意,递归的返回值要利用上,这是更换子树的机会。

强化与提问

* 递归关键点:

   * 只考虑两层,root跟(root->left && root->right)。

   * 何时递归

   * 何时结束递归

* 方法不一样时,要留意的点很可能也不一样。在一个方法中容易犯的错,在另一个方法中可能根本就不存在。所以,想办法有时候是解决问题的关键。

* 代码上的细节,有时决定了成败。


#include <stdio.h>

struct TreeNode {
  int val;
  struct TreeNode *left;
  struct TreeNode *right;
};

struct TreeNode* merge(struct TreeNode* l, struct TreeNode* r) {
    if (l && r) {
        l->val += r->val;
        l->left = merge(l->left, r->left);
        l->right = merge(l->right, r->right);
        return l;
    }
    else {
        return l?l:r;
    }
}

struct TreeNode* mergeTrees(struct TreeNode* t1, struct TreeNode* t2) {
   struct TreeNode* ret = t1;
   merge(t1, t2);
   return ret;
}

void printTree(struct TreeNode* tree) {
    if (tree) {
        printf("%d, ", tree->val);
        printTree(tree->left);
        printTree(tree->right);
    }
    else {
        printf("NULL, ");
    }
}

int main(int argc, char *argv[])
{
    struct TreeNode n1={1,0,0};
    struct TreeNode n2={3,0,0};
    struct TreeNode n3={2,0,0};
    struct TreeNode n4={5,0,0};
    n1.left = &n2;
    n1.right = &n3;
    n2.left = &n4;
    struct TreeNode r1={2,0,0};
    struct TreeNode r2={1,0,0};
    struct TreeNode r3={3,0,0};
    struct TreeNode r4={4,0,0};
    struct TreeNode r5={7,0,0};
    r1.left = &r2;
    r1.right = &r3;
    r2.right = &r4;
    r3.right = &r5;
    printf("tree1:\n");
    printTree(&n1);
    printf("\ntree2:\n");
    printTree(&r1);
    printf("\nmerged:\n");
    struct TreeNode* ret = mergeTrees(&n1, &r1);
    printTree(ret);
    printf("\n");

    return 0;
}

leetcode算法题2: 合并两个二叉树。递归,如何切入并保持清醒?的更多相关文章

  1. 【算法题目】Leetcode算法题思路:两数相加

    在LeetCode上刷了一题比较基础的算法题,一开始也能解出来,不过在解题过程中用了比较多的if判断,看起来代码比较差,经过思考和改进把原来的算法优化了. 题目: 给出两个 非空 的链表用来表示两个非 ...

  2. LeetCode刷题--21.合并两个有序链表(简单)

    题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1 -> 2 -> 4 ,1 -> 3 -> 4 输出:1 ...

  3. leetcode刷题-88.合并两个有序数组

    题目 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...

  4. LeetCode 617. Merge Two Binary Tree (合并两个二叉树)

    Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...

  5. [LeetCode每日一题]88. 合并两个有序数组

    [LeetCode每日一题]88. 合并两个有序数组 问题 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 初始化 n ...

  6. LeetCode算法题-Merge Two Binary Trees(Java实现)

    这是悦乐书的第274次更新,第290篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第142题(顺位题号是617).提供两个二叉树,将其合并为新的二叉树,也可以在其中一个二 ...

  7. LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)

    这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...

  8. LeetCode算法题-Reach a Number(Java实现)

    这是悦乐书的第310次更新,第331篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第179题(顺位题号是754).你站在无限数字线的0号位置.在目的地有个target.在 ...

  9. LeetCode算法题-Longest Univalue Path(Java实现)

    这是悦乐书的第290次更新,第308篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第158题(顺位题号是687).给定二叉树,找到路径中每个节点具有相同值的最长路径的长度 ...

随机推荐

  1. 使用python实现计算器功能

    学习python过程中的作业.实现了+.-.×./.及幂运算,支持括号优先级. 代码为python3.5 import re def formatEquation(string): string = ...

  2. swift 之SnapKit 动画

    这个问题纠结了我挺长时间的.一直以为把约束直接添加到动画里面就可以了.但是并没那么简单.-.-其实还是挺简 class ViewController: UIViewController { @IBOu ...

  3. Cable master

    Problem Description Inhabitants of the Wonderland have decided to hold a regional programming contes ...

  4. 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest J. Bottles

    J. Bottles time limit per test 2 seconds memory limit per test 512 megabytes input standard input ou ...

  5. 【Spring】渲染Web视图

    前言 前面学习了编写Web请求的控制器,创建简单的视图,本篇博文讲解控制器完成请求到结果渲染到用户的浏览器的过程. 渲染Web视图 理解视图解析 前面所编写的控制器方法都没有直接产生浏览器中渲染所需要 ...

  6. HTML5 设备上的API

    一.Vibration API ,接受两种类型参数 vibrate (unsigned long time)   当参数是unsigned long的时候 此时参数表示震动时间.  NotSuppor ...

  7. linux 安装wordpress 无故往外发送大量垃圾邮件

    linux 安装wordpress 无故往外发送大量垃圾邮件 始末 表现出来的现象就是, 网站运行没多久,mysql服务就挂了,重启也无法启动起来,提示 No such file or dicrion ...

  8. python jason,pickle

    参考官网 https://docs.python.org/3/library/json.html https://docs.python.org/3/library/pickle.html 了解这两个 ...

  9. 关于帧动画steps属性的理解

    CSS3的Animation有八个属性 animation-name animation-duration animation-delay animation-iteration-count anim ...

  10. Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例

    由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...