⭐算法入门⭐《深度优先搜索》简单02 —— LeetCode 617. 合并二叉树

Posted 英雄哪里出来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⭐算法入门⭐《深度优先搜索》简单02 —— LeetCode 617. 合并二叉树相关的知识,希望对你有一定的参考价值。

一、题目

1、题目描述

  给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。需要将它们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
  样例输入:

  样例输出:

2、基础框架

  • c++ 版本给出的基础框架代码如下:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
    }
};
  • TreeNode代表一个二叉树节点,有数据域和指针域两部分组成,数据域为val,指针域为leftright,分别指向左右两个子树的根节点;
  • TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2)这个接口,传参root1root2为两个需要合并的二叉树的根节点,返回的是合并后的二叉树的根节点。

3、原题链接

LeetCode 617. 合并二叉树

二、解题报告

1、思路分析

遇到二叉树问题,基本第一个思路就是递归。根据经验,来谈谈递归需要注意的点:
  1)递归出口一定要考虑好,这个题的递归出口就是两棵树中任意一棵是空树的情况;
  2)对于非递归出口,先处理根节点,再递归处理 左子树 和 右子树。处理的过程中一定要清楚明白,处理的事情是什么,返回值是什么。这个题中处理的事情就是将两棵树的根节点合并,返回值就是合并后的树根。合并后的树根可以使用新申请的内存。
  3)需要注意,千万不要返回栈上变量的地址,函数销毁的时候,栈变量的生命周期也就结束了。

2、时间复杂度

  • 每个节点只会访问一次,时间复杂度为 O ( n ) O(n) O(n)

3、代码详解

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        TreeNode *p = new TreeNode();                           // (1)
        if(root1 == nullptr) {
            return root2;                                       // (2)
        }else if(root2 == nullptr) {
            return root1;                                       // (3)
        }else {
            p->val = root1->val + root2->val;                   // (4)
            p->left = mergeTrees(root1->left, root2->left);     // (5)
            p->right = mergeTrees(root1->right, root2->right);  // (6)
        }
        return p;
    }
};

  • ( 1 ) (1) (1) 必须在堆上申请内存,否则函数返回时就销毁了;这里的p为合并后的树的根节点指针;
  • ( 2 ) (2) (2) 如果root1为空树,则直接返回root2
  • ( 3 ) (3) (3) 如果root2为空树,则直接返回root1
  • ( 4 ) (4) (4) 当两者都不为空树时,将两棵树的根节点的值相加,赋值给合并后的树根的数据域val
  • ( 5 ) (5) (5) 递归合并左子树;
  • ( 6 ) (6) (6) 递归合并右子树;

三、本题小知识

递归问题,千万不要返回栈上变量的地址(从堆上申请),函数销毁的时候,栈变量的生命周期也就结束了。

四、加群须知

  相信看我文章的大多数都是「 大学生 」,能上大学的都是「 精英 」,那么我们自然要「 精益求精 」,如果你还是「 大一 」,那么太好了,你拥有大把时间,当然你可以选择「 刷剧 」,然而,「 学好算法 」,三年后的你自然「 不能同日而语 」
  那么这里,我整理了「 几十个基础算法 」 的分类,点击开启:

🌌《算法入门指引》🌌

  如果链接被屏蔽,或者有权限问题,可以私聊作者解决。

  大致题集一览:





  为了让这件事情变得有趣,以及「 照顾初学者 」,目前题目只开放最简单的算法 「 枚举系列 」 (包括:线性枚举、双指针、前缀和、二分枚举、三分枚举),当有 一半成员刷完 「 枚举系列 」 的所有题以后,会开放下个章节,等这套题全部刷完,你还在群里,那么你就会成为「 夜深人静写算法 」专家团 的一员。
  不要小看这个专家团,三年之后,你将会是别人 望尘莫及 的存在。如果要加入,可以联系我,考虑到大家都是学生, 没有「 主要经济来源 」,在你成为神的路上,「 不会索取任何 」
  🔥联系作者,或者扫作者主页二维码加群,加入刷题行列吧🔥


🔥让天下没有难学的算法🔥

C语言免费动漫教程,和我一起打卡!
🌞《光天化日学C语言》🌞

入门级C语言真题汇总
🧡《C语言入门100例》🧡

几张动图学会一种数据结构
🌳《画解数据结构》🌳

组团学习,抱团生长
🌌《算法入门指引》🌌

竞赛选手金典图文教程
💜《夜深人静写算法》💜

以上是关于⭐算法入门⭐《深度优先搜索》简单02 —— LeetCode 617. 合并二叉树的主要内容,如果未能解决你的问题,请参考以下文章

算法入门 05深度优先搜索(简单 - 第一题)LeetCode 733

算法入门深度优先搜索(中等 - 第二题)LeetCode 46

算法入门深度优先搜索(DFS)

算法入门 05深度优先搜索(中等 - 第一题)LeetCode 695

数据结构与算法—— * 深度优先搜索入门 *

广度优先搜索与深度优先搜索