给你一棵二叉树,请你返回层数最深的叶子节点的和。
示例:
输入:root = [1,2,3,4,5,null,6,7,null,null,null,null,8]
输出:15
提示:
树中节点数目在 1 到 10^4 之间。
每个节点的值在 1 到 100 之间
思路:
深度优先搜索
我们可以使用深度优先搜索的方法解决这个问题。
我们从根节点开始进行搜索,在搜索的同时记录当前节点的深度 dep
。我们维护两个全局变量 maxdep
和 total
,其中 maxdep
表示搜索到的节点的最大深度,total
表示搜索到的深度等于 maxdep
的节点的权值之和。
当我们搜索到一个新的节点 x
时,会有以下三种情况:
节点 x
的深度 dep
小于 maxdep
,那么我们可以忽略节点 x
,继续进行搜索;
节点 x
的深度 dep
等于 maxdep
,那么我们将节点 x
的权值添加到 total
中;
节点 x
的深度 dep
大于 maxdep
,此时我们找到了一个深度更大的节点,因此需要将 maxdep
置为 dep
,并将 total
置为节点 x
的权值。
在深度优先搜索结束之后,深度最大的叶子节点的权值之和即存储在 total
中。
题解:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int total =0;
int maxDeep=0;
public int deepestLeavesSum(TreeNode root) {
dfs(root, 1);
return total;
}
public void dfs(TreeNode node, int deep){
if(node==null)
return;
if(deep==maxDeep)
total+=node.val;
if(deep>maxDeep){
maxDeep=deep;
total=node.val;
}
dfs(node.left, deep+1);
dfs(node.right, deep+1);
}
}