/* 
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. LeetCode 136. Single Number (落单的数)

    Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...

  2. JAVA提高九:集合体系

    在经过了前面的JDK6.0新特性的学习后,将进一步深入学习JDK,因为集合的重要性,因此从集合开始入手分析: 一.集合概况 Java是一种面向对象语言,如果我们要针对多个对象进行操作,那么首先必要将多 ...

  3. Excel 查找某列中的数据在另一列是否存在及输出第三例的数据

    最近在操作Excel文件数据导入数据库时,经常需要检查Excel中哪些数据数据库中已经存在,哪些不存在,然后再将不存在数据库中的Excel数据导入:在此过程中,经常需要操作Excel中的数据,所以.也 ...

  4. Android O --Soong Build

    Concept: Kati (https://android.googlesource.com/platform/build/kati/) - Reads Android.mk files -> ...

  5. 使用bower init创建bower.json文件

    使用bower init 可以快速创建bower.json文件 bower init 回答一系列问题后就可以了,其中大部分问题可以按enter跳过.

  6. Pie

    Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no ...

  7. css 权重 特殊性

    选择器的特异性由 CSS2 规范定义如下:     !important的规则比其他的权值都大     p{color: red !important} 如果声明来自于“style”属性,而不是带有选 ...

  8. DOM Exception error 类型

    INDEX_SIZE_ERR  code 1                              索引是负值,或者超过了索引值 DOMSTRING_SIZE_ERR  code 2       ...

  9. vue初级学习--组件的使用(自定义组件)

    一.导语 突然冒出四个字,分即是合,嗯,优点道理....................... 二.正文 在搞的仿淘宝demo,之前加入购物车是与商品详情一块的,今天把它单独拆出来,复用性高点,那这样 ...

  10. 开发环境MAPLAB下使用仿真器ICD2程序下载流程

    程序下载流程 一.    连接示意图 二.    下载步骤 1.目标板电源断开 2.将仿真器下载端口与电路板JTAG端口有效连接 3.启动MPLAB软件 4.点击MAPLAB软件上方Programme ...