当前位置: 首页 > news >正文

左神算法之二叉树最大路径和问题

二叉树最大路径和问题(Java实现)

文章目录

  • 二叉树最大路径和问题(Java实现)
    • 1. 题目描述
    • 2. 问题解释
    • 3. 解决思路
    • 4. 代码实现
    • 5. 总结

1. 题目描述

给定一棵二叉树,其中每个节点都包含一个整型权值。要求计算从根节点到叶节点的所有路径中,权值和最大的值是多少。

2. 问题解释

  • 必须从根节点出发到叶子节点结束
  • 需要遍历所有可能的路径
  • 找出所有路径和中最大的那个值
  • 叶子节点是指没有子节点的节点

3. 解决思路

采用深度优先搜索(DFS)递归方法:

  1. 如果当前节点是null,返回0(虽然题目保证有根节点,但递归时需要处理)
  2. 如果是叶子节点,返回节点值本身
  3. 递归计算左右子树的最大路径和
  4. 返回当前节点值加上左右子树中较大的那个和

4. 代码实现

public class Problem07_MaxSumInTree {public static class Node {public int value;public Node left;public Node right;public Node(int data) {value = data;}}public static int maxSum = Integer.MIN_VALUE;public static int maxSum(Node head) {p(head, 0);return maxSum;}public static void p(Node head, int pre) {if (head == null) {return;}if (head.left == null && head.right == null) {maxSum = Math.max(maxSum, pre + head.value);}if (head.left != null) {p(head.left, pre + head.value);}if (head.right != null) {p(head.right, pre + head.value);}}// 另一种方式public static int maxSum2(Node head) {if (head == null) {return 0;}return process2(head);}public static int process2(Node head) {if (head == null) {return 0;}if(head.left == null && head.right == null){return head.value;}int next = Integer.MIN_VALUE;if(head.left != null){next = process2(head.left);}if(head.right != null){next = Math.max(next, process2(head.right));}return head.value + next;}public static void main(String[] args) {// 构建示例二叉树//         1//      /   \//     2     3//    / \   / \//   4   5 6   7Node head = new Node(1);head.left = new Node(2);head.right = new Node(3);head.left.left = new Node(4);head.left.right = new Node(5);head.right.left = new Node(6);head.right.right = new Node(7);System.out.println(maxSum(head));	 // 11System.out.println(maxSum2(head)); 	// 11}}

5. 总结

  1. 使用DFS递归方法简洁高效
  2. 时间复杂度:O(n),需要访问所有节点
  3. 空间复杂度:O(h),h为树的高度,递归调用栈的深度
  4. 注意处理叶子节点和空节点的情况
  5. 该方法只能用于计算根到叶的路径和,不是任意节点间的最大路径和
http://www.lqws.cn/news/512875.html

相关文章:

  • RedisVL EmbeddingsCache深度实践与最佳指南
  • LangGraph--基础学习(Human-in-the-loop 人工参与深入学习2)
  • 在智慧教育行业中,OPS插拔式电脑启到什么作用
  • 【沉浸式解决问题】微服务子模块引入公共模块的依赖后无法bean未注入
  • 磁悬浮轴承温度漂移克星:三招实现精准控制
  • 桌面小屏幕实战课程:DesktopScreen 9 GPIO
  • 轻巧灵动,智启未来 ——Kinova Gen3 Lite 机器人轻松解锁各行业自动化新姿势
  • 集成学习基础:Bagging 原理与应用
  • 多模态大模型(从0到1)
  • CRMEB PHP多门店版v3.2.1系统全开源+Uniapp前端+搭建教程
  • 【stm32】标准库学习——USART串口
  • 2023年全国青少年信息素养大赛Python 复赛真题——玩石头游戏
  • 大模型时代的创业机遇
  • 左神算法之双集合平均值优化操作的最大次数
  • SIAM-2011《Weighted Graph Compression for Parameter-free Clustering With PaCCo》
  • 【基础篇-消息队列】—— 如何实现单个队列的并行消费及如何保证消息的严格顺序
  • 爬取小红书相关数据导入到excel
  • SpringCloud系列(35)--使用HystrixDashboard进行服务监控
  • 《汇编语言:基于X86处理器》第4章 数据传送、寻址和算术运算(2)
  • 行为验证码 AJ-Captcha 使用文档
  • Golang Kratos 系列:领域层model定义是自洽还是直接依赖第三方(三)
  • C++字符串的行输入
  • MySQL之SQL性能优化策略
  • 《仿盒马》app开发技术分享-- 兑换列表展示(68)
  • git操作练习(3)
  • 【Python-Day 29】万物皆对象:详解 Python 类的定义、实例化与 `__init__` 方法
  • SQL Server从入门到项目实践(超值版)读书笔记 18
  • git commit --no-verify -m ““ 命令的作用是什么
  • LangChain网页自动化PlayWrightBrowserToolkit
  • Python训练营-Day40-训练和测试的规范写法