题目链接:https://leetcode.cn/problems/deepest-leaves-sum/
题目难度:中等
题意
给你一棵二叉树的根节点 root
,请你返回 层数最深的叶子节点的和 。
示例1:
输入:root = [1,2,3,4,5,null,6,7,null,null,null,null,8]
输出:15
示例2:
输入:root = [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5]
输出:19
提示:
- 树中节点数目在范围
[1, 104]
之间。 1 <= Node.val <= 100
题解:搜索
题目要求计算层数最深的叶子节点的和,于是只需要找出最深的层数是多少(假设为maxstep),然后计算所有层数为maxstep的叶子节点权值之和即可。
- 非常直接的思路:直接定义一个二维数组,存储所有层数对应叶子节点的权值。遍历整棵二叉树,在存储所有权值的同时,更新maxstep。最后只需遍历层数为maxstep的叶子节点,累加权值即可
- 稍微优化:无需二维数组,只需要在遍历二叉树的同时更新maxstep,随之更新结果权值和。具体为:
- 当前节点层数 > maxsetp,则更新maxstep,同时更新ans为此时节点的权值
- 当前节点层数 == maxstep,则直接ans累加上此时节点的权值
此处均只用了dfs,bfs同样适用。
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:
//记录每层节点对应的所有权值
vector<int> nodes[10005];
int maxstep = 0;
void dfs(TreeNode* root,int step){
if(root == nullptr) return ;
nodes[step].push_back(root->val);
maxstep = max(maxstep,step);
dfs(root->left,step+1);
dfs(root->right,step+1);
}
int deepestLeavesSum(TreeNode* root) {
dfs(root,1);
int ans=0;
for(int i=0;i<nodes[maxstep].size();i++){
ans+=nodes[maxstep][i];
}
return ans;
}
};
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:
int maxstep = 0,ans=0;
void dfs(TreeNode* root,int step){
if(root == nullptr) return ;
if(step > maxstep){
maxstep = step;
ans = root->val;
}else if(step == maxstep){
ans = ans + root->val;
}
dfs(root->left,step+1);
dfs(root->right,step+1);
}
int deepestLeavesSum(TreeNode* root) {
dfs(root,1);
return ans;
}
};