【
给你一棵二叉树的根节点 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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/deepest-leaves-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
】
方法一 :
这道题的难点在于怎么知道最大深度呢?所以先遍历一次,找到最大深度,然后再遍历一次,在最大深度时计算叶子节点的和
int maxdeep;
int sum;
void Preorder(struct TreeNode* root, int deep)
{
if (root == NULL) {
return; // 这里left,right肯定有一个不为空
}
if (root->left == NULL && root->right == NULL) {
maxdeep = fmax(maxdeep, deep); // 更新深度
return;
}
deep++;
Preorder(root->left, deep);
Preorder(root->right, deep);
}
void Getsum(struct TreeNode* root, int deep)
{
if (root == NULL) {
return; // 这里left,right肯定有一个不为空
}
if (root->left == NULL && root->right == NULL) {
if (deep == maxdeep) { // 叶子节点,并是最深
sum += root->val;
}
return;
}
deep++;
Getsum(root->left, deep);
Getsum(root->right, deep);
}
int deepestLeavesSum(struct TreeNode* root){
maxdeep = 0;
sum = 0;
if (root->left == NULL && root->right == NULL) {
return root->val; // 根节点就是最深
}
Preorder(root->left, 1);
Preorder(root->right, 1);
Getsum(root->left, 1); // 开始求sum了
Getsum(root->right, 1);
return sum;
}
方法二:
上面方法看起来明显冗余,那么怎么优化呢?可不可以把最大深度在遍历时就确定呢?
我们可以不断的更新最大深度,这样求最大深度,那当更新最大深度时,sum的值要如何算?sum重新赋值等于当前值就行了,代码量缩小一半
int maxdeep;
int sum;
void Preorder(struct TreeNode* root, int deep)
{
if (root == NULL) {
return; // 这里left,right肯定有一个不为空
}
if(deep == maxdeep) {
sum += root->val; // 当前是最大深度时,sum+
} else if (deep > maxdeep) {
maxdeep = deep; // 更新最大深度和sum的值
sum = root->val;
}
deep++;
Preorder(root->left, deep);
Preorder(root->right, deep);
}
int deepestLeavesSum(struct TreeNode* root){
maxdeep = 0;
sum = 0;
if (root->left == NULL && root->right == NULL) {
return root->val; // 根节点就是最深
}
Preorder(root->left, 1);
Preorder(root->right, 1);
return sum;
}