无尽算法之 层数最深的叶子节点之和(层遍历)

给你一棵二叉树,请你返回层数最深的叶子节点的和。

示例:

输入:root = [1,2,3,4,5,null,6,7,null,null,null,null,8]
输出:15

提示:

树中节点数目在 1 到 10^4 之间。
每个节点的值在 1 到 100 之间

思路:

深度优先搜索
我们可以使用深度优先搜索的方法解决这个问题。

我们从根节点开始进行搜索,在搜索的同时记录当前节点的深度 dep。我们维护两个全局变量 maxdeptotal,其中 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);
    }
}
发布了152 篇原创文章 · 获赞 274 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_33709508/article/details/104017159