面试热题(二叉树的最大路径)

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给定一个二叉树的根节点 root ,返回其 最大路径和,即所有路径上节点值之和的最大值。

 输入:root = [1,2,3] 输出:6 解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

 这道题作为二叉树中的困难题,其实做起来也没有那么困难

       考虑题目定义的路径的一般情形:一条路从下向上延伸,到达一个最高节点后又向下延伸,将最高点节点称为拐点,但是拐点左侧或者右侧可能没有这个节点,我们需要考虑每个节点node作为拐点,都将有一个以其拐点的最大路径之和,并由下面式子得到:

leftRree+rightTree+root.val

       这里的leftTree/rightTree作为root的左右节点为该路径和带来的贡献,分别是拐点左半侧路径和拐点右半侧路径和,这道题求解过程就是考察当所有的节点作为拐点时该式的结果,最后取最大值,显然该式具有后续遍历dfs的特点(左右中),dfs()方法的参数为当前节点root,返回root作为拐点儿子的半侧路径和

  • 基准情形为递归到null时返回0
  • 递归得到调用dfs分别求左右儿子的leftTree和rightTree
  • 得到leftTree/rightTree后,以该式计算当前节点为拐点的最大路径max
  • 更新全局最大路径和max
  • 返回值是当前节点root作为拐点儿子的贡献值,容易有如下:
return root.val+Math.max(leftTree,rightTree);

即root将与其左右半侧路径中的较大者构成对上层拐点而言的更长的半侧路径

  • 当dfs结束后,max中的值就是正确结果 

 注意:由于树中的节点可能都是负数,所以在取贡献的时候,如果为负数直接取0,表示该节点所在的侧路径不参与组成最大路径

源码:

    //维护一个全局变量int max=Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {//对入参进行判断if(root==null){return 0;}dfs(root);return max;}public int dfs(TreeNode root){//递归结束条件if(root==null){return 0;}int leftTree=Math.max(dfs(root.left),0);int rightTree=Math.max(dfs(root.right),0);int all=leftTree+rightTree+root.val;//更新最大值max=Math.max(max,all);return root.val+Math.max(leftTree,rightTree);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/82370.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科研 | Zotero导入无PDF的参考文献、书籍

最近在用Zotero在Word中插入参考文献的时候发现,有些没在网上找到对应的PDF版本,但也不是必须要PDF版本的参考文献或者参考书籍,如何才能不影响正常的文献排版 主要是先在网上找到对应文献,书籍,网页等的ISBN&#xf…

Java smslib包开发

上一篇文章我详细介绍RXTXcomm的安装方法和简单代码,如果小伙伴涉及到需要使用手机短信模块完成短信收发需求的话,可以使用到smslib进行开发。 首先还是同样的,将整个smslib包源码导入项目,并且将它所需依赖一起进行导入 导入完成之后,我们就可以对smslib包进行二次开发了 下面…

【⑭MySQL | 数据类型(二)】字符串 | 二进制类型

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL字符串 | 二进制类型类型的分享✨ 目录 前言5 字符串类型6 二进制类型总结 5 字符串类型 字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比…

安卓系列机型-禁止安装某软件 防止“沉迷游戏的小孩”操作解析

如何禁止安装某软件。这里以好课帮app为例做个演示步骤说明。这个博文的目的在于可以阻止他人用手机安装你指定的一些软件。 💔💔💔首先手机上安装好课帮这个软件。打开应用详情找到包名。或者使用第三方工具打开获取这个软件的包名。记住是…

Nevron 3DChart Crack,可视化界面在运行时可用

Nevron 3DChart Crack,可视化界面在运行时可用 3DChart使用OpenGL 3D图形引擎创建复杂的2D和3D图表,这些图表可以包含静态或动画图像。3DChart包括一个用于生成图表模板的独立应用程序和一个ASP服务器配置实用程序。该组件还包括一个专门设计用于与3DChart集成的工具…

maven打出jar中动态替换占位符

使用场景&#xff1a; maven打出的jar中pom.xml动态替换占位符 有些时候某些公共工具jar包被项目引用后发现公共jar的pom.xml中的version依然还是占位符&#xff0c;例如下面 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok<…

微信录屏怎么录?2种方法教会你

“微信怎么录屏呀&#xff0c;奶奶不会用微信&#xff0c;打电话跟她讲&#xff0c;怎么也说不清楚&#xff0c;老人家年纪大了&#xff0c;耳朵不好使&#xff0c;就想录一个微信使用教程给她&#xff0c;可是不懂怎么录屏&#xff0c;有人知道微信怎么录屏吗&#xff0c;感谢…

线性代数的学习和整理4: 求逆矩阵的多种方法汇总

目录 原始问题&#xff1a;如何求逆矩阵&#xff1f; 1 EXCEL里&#xff0c;直接可以用黑盒表内公式 minverse() 数组公式求A- 2 非线性代数方法&#xff1a;解方程组的方法 3 增广矩阵的方法 4 用行列式的方法计算&#xff08;未验证&#xff09; 5 A-1/|A|*A* &…

带着问题看SpringBoot

带着问题看SpringBoot 1、Spring容器具体是什么&#xff1f; 跟进run方法&#xff0c;context this.createApplicationContext()&#xff0c;得出容器是AnnotationConfigServletWebServerApplicationContext类。 SpringApplication.run(ServeroneApplication.class, args);…

【Git游戏】提交的技巧

修改历史的提交 rebase 通过git rebase -i 将要修改的提交提到最前端&#xff0c; 然后修改&#xff0c;再通过git commit --amend提交该记录&#xff0c;最后通过git rebase -i 在替换会原始的位置 &#xff08;该过程中有可能会产生rebase confict&#xff09; cherry-pick …

sql数据库怎么备份,sql 实时备份

在当今互联网时代&#xff0c;数据已经成为企业的核心资产。然而&#xff0c;数据的安全性和完整性面临硬件问题、软件故障、人工操作错误等各种威胁。为了保证数据的安全&#xff0c;实时备份已经成为公司必须采取的重要措施之一。下面我们就重点介绍SQL实时备份的重要实施方法…

Leetcode.73矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法 class Solution {public void setZeroes(int[][] matrix) {int m matrix.length, n matrix[0].length;boolean[] row new boolean[m];boolean[] col…