写在前面
本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……
专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:
- Tag:介绍本题牵涉到的知识点、数据结构;
- 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
- 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
- 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
- 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。
Tag
【二叉树】【递归/深搜】【广搜】
题目来源
![](https://i-blog.csdnimg.cn/blog_migrate/b137cb3c173c7a9bcc11914c3710a471.png)
解题思路
方法一:递归/深搜
思路
思路比较简单,从根节点开始向叶子节点递归,维护一个全局变量表示所有数字之和 sum
,将该变量随着递归向下传递。每到一个节点就更新从根节点到该节点组成的数字 num
,当遇到没有子节点的子节点时,更新 sum
。
代码
/**
* 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:
int sum = 0;
int sumNumbers(TreeNode* root) {
if(root == nullptr)
return 0;
dfs(root, 0);
return sum;
}
void dfs(TreeNode* root, int num){
num = num * 10 + root->val;
if(root->left == nullptr && root->right == nullptr){
sum += num;
return;
}
if(root->left != nullptr)
dfs(root->left, num);
if(root->right != nullptr)
dfs(root->right, num);
}
};
复杂度分析
时间复杂度: O ( n ) O(n) O(n), n n n 是二叉树的节点个数。
空间复杂度: O ( n ) O(n) O(n)。
方法二:广搜
思路
按照广度优先搜索的方式解题,维护两个队列 que_node
和 que_val
一个用来存放二叉树的节点,一个用来表示从根节点到当前节点组成的数字。这一点和 112. 路径总和 有点像。
还需要维护一个全局变量 sum
,表示答案。按照广度优先搜索的方式遍历二叉树,当遍历到叶子节点时,更新 sum
。最后返回 sum
即为答案。
队列以及 sum
的更新方式见代码。
代码
/**
* 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:
int sumNumbers(TreeNode* root) {
if (!root) {
return 0;
}
int sum = 0;
queue<TreeNode*> que_node;
queue<int> que_val;
que_node.push(root);
que_val.push(root->val);
while (!que_node.empty()) {
TreeNode* cur = que_node.front(); que_node.pop();
int num = que_val.front(); que_val.pop();
if (!cur->left && !cur->right) {
sum += num;
}
if (cur->left) {
que_node.push(cur->left);
que_val.push(num * 10 + cur->left->val);
}
if (cur->right) {
que_node.push(cur->right);
que_val.push(num * 10 + cur->right->val);
}
}
return sum;
}
};
复杂度分析
时间复杂度: O ( n ) O(n) O(n), n n n 是二叉树的节点个数。
空间复杂度: O ( n ) O(n) O(n)。
写在最后
如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。
如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。
最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。