• 【二叉树】层数最深叶子节点的和


    题目描述

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

    示例1

    输入:root = [1,2,5,7,0,null,null]
    输出:7

    解题思路 

    这道题正向思路是每一层都做一次计算,直到等到最后一层的结果;

    TreeNode参考代码如下:

    package org.example;

    public class TreeNode {
        public int val;
        public TreeNode left;
        public TreeNode right;

        public TreeNode() {
        }

        public TreeNode(int val) {
            this.val = val;
        }

        public TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

    按照这个思路:

    • 第一层,结果为1;
    • 第二层,结果为7;
    • 第三层,结果也为7;
    • 返回最后一层结果;

    为了能解决上述问题,我使用了队列(java中的Deque),代码实现如下:

    1. import org.example.TreeNode;
    2. import java.util.Deque;
    3. import java.util.LinkedList;
    4. public class Solution3 {
    5. public int deepestLeavesSum(TreeNode root) {
    6. Deque deque = new LinkedList<>();
    7. if (root != null) {
    8. deque.offer(root);
    9. }
    10. int sum = 0;
    11. while (!deque.isEmpty()) {
    12. int size = deque.size();
    13. sum = 0;
    14. for (int i = 0; i < size; i++) {
    15. TreeNode node = deque.poll();
    16. sum += node.val;
    17. if (node.left != null) {
    18. deque.offer(node.left);
    19. }
    20. if (node.right != null) {
    21. deque.offer(node.right);
    22. }
    23. }
    24. }
    25. return sum;
    26. }
    27. public static void main(String[] args) {
    28. Solution3 solution = new Solution3();
    29. TreeNode root = new TreeNode(1);
    30. root.left = new TreeNode(2);
    31. root.right = new TreeNode(3);
    32. root.left.left = new TreeNode(4);
    33. root.left.right = new TreeNode(5);
    34. root.left.left.left = new TreeNode(7);
    35. root.right.right = new TreeNode(6);
    36. root.right.right.right = new TreeNode(8);
    37. System.out.println(solution.deepestLeavesSum(root));
    38. }
    39. }

    为了能够提升效率,这里我使用dfs做改造,完全使用递归核心逻辑:

    • 如果节点为null,直接返回;
    • 如果节点所在层数大于最大层数,则让最大层数加一,同时将结果设置成0;
    • 如果节点所在层数等于最大层数,则做加法,结果加上根节点的value;
    • 然后递归调用代码;

    具体代码实现如下:

    1. import org.example.TreeNode;
    2. public class Solution {
    3. int maxLevel = 0;
    4. int res = 0;
    5. public int deepestLeavesSum(TreeNode root) {
    6. dfs(root, 0);
    7. return res;
    8. }
    9. private void dfs(TreeNode root, int level) {
    10. if (root == null) {
    11. return;
    12. }
    13. if (maxLevel < level) {
    14. maxLevel = level;
    15. res = 0;
    16. }
    17. if (level == maxLevel) {
    18. res += root.val;
    19. }
    20. dfs(root.left, level + 1);
    21. dfs(root.right, level + 1);
    22. }
    23. public static void main(String[] args) {
    24. Solution solution = new Solution();
    25. TreeNode root = new TreeNode(1);
    26. root.left = new TreeNode(2);
    27. root.right = new TreeNode(3);
    28. root.left.left = new TreeNode(4);
    29. root.left.right = new TreeNode(5);
    30. root.left.left.left = new TreeNode(7);
    31. root.right.right = new TreeNode(6);
    32. root.right.right.right = new TreeNode(8);
    33. System.out.println(solution.deepestLeavesSum(root));
    34. }

     这个是2代码实现的耗时差别,1ms的使用dfs,6ms的是最初的解决思路。

     

    总结

    这道题是一道中等难度的二叉树遍历的题目,如果对二叉树DFS和BFS都比较清楚,能快速的解决这个问题。如果有更快、更简洁的代码实现欢迎回复。

  • 相关阅读:
    【算法设计】回溯法算法设计——骑士游历问题(C++实现)
    《软件方法》自测题解析008:系统作为整体的表现
    树的基本术语
    西门子S7-1200F或1500F系列安全PLC的组态步骤和基础编程(一)
    数据结构与算法解题-20240422
    【无标题】
    文献解读——基于深度学习的病毒宿主预测
    Rust之Cargo的使用
    android 12 framework开发第53节-Activity的reLaunch及onConfigurationChanged android源码分析
    基于JAVA手办周边商城计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  • 原文地址:https://blog.csdn.net/weiliuhong1/article/details/126394278