算法入门深度优先搜索(简单 - 第二题)LeetCode 617
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法入门深度优先搜索(简单 - 第二题)LeetCode 617相关的知识,希望对你有一定的参考价值。
🙉饭不食,水不饮,题必须刷🙉
还不会C语言,和我一起打卡! 🌞《光天化日学C语言》🌞
LeetCode 太难?上简单题! 🧡《C语言入门100例》🧡
LeetCode 太简单?大神盘他! 🌌《夜深人静写算法》🌌
一、题目
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
,指针域为left
和right
,分别指向左右两个子树的根节点;
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2)
这个接口,传参root1
和root2
为两个需要合并的二叉树的根节点,返回的是合并后的二叉树的根节点。
3、原题链接
二、解题报告
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) 递归合并右子树;
三、本题小知识
递归问题,千万不要返回栈上变量的地址(从堆上申请),函数销毁的时候,栈变量的生命周期也就结束了。
以上是关于算法入门深度优先搜索(简单 - 第二题)LeetCode 617的主要内容,如果未能解决你的问题,请参考以下文章
算法入门广度优先搜索(中等 - 第二题)LeetCode 116
算法入门 05深度优先搜索(简单 - 第一题)LeetCode 733