【算法系列之十三】二叉树两叶节点的最大距离

1、题目描述
    给定一棵二叉树,计算这课二叉树的直径长度,即为二叉树任意两个节点间的最长路径。比如:

        

     这棵二叉树的最长路径为3。

2、解题思路
    使用递归进行求解,每次递归的过程中,先求出以某个节点为树根的二叉树的左子树的最长深度maxLeft、右子树的最长深度maxRight,并在递归函数中用一个变量maxLen来保存任意两个节点间的最长路径。在求出左子树的最长深度maxLeft和右子树的最长深度maxRight之后,就可以求出以该节点为根的二叉树的最长路径maxLen。具体代码如下:

public class Solution {static int maxLen = 0;public static void main(String[] args) {TreeNode root = new TreeNode(0);TreeNode p1 = new TreeNode(1);TreeNode p2 = new TreeNode(2);TreeNode p3 = new TreeNode(3);TreeNode p4 = new TreeNode(4);TreeNode p5 = new TreeNode(5);TreeNode p6 = new TreeNode(6);TreeNode p7 = new TreeNode(7);TreeNode p8 = new TreeNode(8);root.left = p1;root.right = p2;p1.left = p3;p3.left = p4;p2.left = p5;p2.right = p6;p6.right = p7;p7.right = p8;FindMaxLen(root);System.out.println(maxLen);}public static void FindMaxLen(TreeNode pRoot) {if (pRoot == null) {// 空的话直接结束return;}if (pRoot.left == null) {// 左子为空,左面最大长度为0pRoot.maxLeft = 0;}if (pRoot.right == null) {// 右子为空,右面最大长度为0pRoot.maxRight = 0;}if (pRoot.left != null) {// 递归获取以左子节点为根节点的最大距离FindMaxLen(pRoot.left);}if (pRoot.right != null) {// 递归获取以右子节点为根节点的最大距离FindMaxLen(pRoot.right);}if (pRoot.left != null) {// 左面最大距离=左子左面最大距离与左子右面最大距离取最大值+1pRoot.maxLeft = Math.max(pRoot.left.maxLeft, pRoot.left.maxRight) + 1;}if (pRoot.right != null) {// 右面最大距离=右子左面最大距离与右子右面最大距离取最大值+1pRoot.maxRight = Math.max(pRoot.right.maxLeft, pRoot.right.maxRight) + 1;}if (pRoot.maxLeft + pRoot.maxRight > maxLen) {// 刷新最大距离maxLen = pRoot.maxLeft + pRoot.maxRight;}}}class TreeNode {TreeNode left;TreeNode right;int maxLeft;int maxRight;int data;public TreeNode(int data) {this.data = data;}
}

3、另一种解法:递归

public static int FindMaxLen(TreeNode pRoot) {if (pRoot == null) {return 0;}// 递归获取左子、右子的最大距离int maxLeft = FindMaxLen1(pRoot.left);int maxRight = FindMaxLen1(pRoot.right);// 刷新最大距离maxLen = Math.max(maxLeft + maxRight, maxLen);// 返回该节点的父节点在该侧的最大距离return Math.max(maxLeft, maxRight) + 1;
}

 

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

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

相关文章

date比较大小 mybatis_Hibernate 和 MyBatis 哪个更好用?

Java大联盟帮助万千Java学习者持续成长关注作者|SylvanasSun郑沐兴https://zhuanlan.zhihu.com/p/21966051B 站搜索:楠哥教你学Java获取更多优质视频教程前言由于编程思想与数据库的设计模式不同,生出了一些ORM框架。核心都是将关系型数据库和…

简单的cpu飙升排查方法

1先来一段飙升代码 public class FindJavaThreadInTaskManager {public static void main(String[] args) {Thread thread new Thread(new Worker());thread.start();}static class Worker implements Runnable {Overridepublic void run() {while (true) {System.out.printl…

tortoisesvn创建部署项目_FrameWork如何进行云托管部署

介绍CloudBase Framework 是云开发官方出品的云原生一体化部署工具,可以帮助开发者将静态网站、后端服务和小程序等应用,一键部署到云开发 Serverless 架构的云平台上,自动伸缩且无需关心运维,聚焦应用本身,无需关心底…

【算法系列之十四】最大子序和

1、题目描述 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 2、…

python的代码复用技术_Python__函数和代码复用

主要内容函数的定义和使用实例:七段数码管的绘制代码复用与函数递归PyInstall库的使用实例:科赫雪花小包裹函数的定义与使用函数的理解与定义函数的使用及调用过程函数的参数传递函数的返回值局部变量和全局变量lambda函数------------------------------------函数…

Queue:poll、offer、element、peek的区别

队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队…

python实现k均值算法_python实现kMeans算法

聚类是一种无监督的学习,将相似的对象放到同一簇中,有点像是全自动分类,簇内的对象越相似,簇间的对象差别越大,则聚类效果越好。1、k均值聚类算法k均值聚类将数据分为k个簇,每个簇通过其质心,即…

mysql给数据量大的表添加索引的办法

有一个问题,一张表有3百万条记录,随着时间的增加,记录量会更多,此时查询速度很慢。在创建此表前没有未相应字段添加索引,所以此时需要为表添加索引。但是因为数据量大的原因,索引添加不成功,想了…

修改背景图片_我花了5小时,为网易修改了一份内容超多的PPT,效果超级赞!!...

微信扫码观看全套Excel、Word、PPT视频作者:宋雪贤 来源:PPT进化论(ID:PPTjinhualun)哈喽,大家好,不知道您看过《我花了3个小时,为京东修改了一份PPT,效果好到惊人!》这篇案例修改文…

MySQL千万级别大表如何优化?

当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值…

linux c 调用python_C程序调用Python脚本

一般调用步骤Py_Initialize(); //初始化Python环境PyImport_ImportModule("test"); // 载入python模块PyObject_GetAttrString(g_pModule,"test1"); //获得相应Python函数的PyObjectPyObject_CallFunction(test1,"i,s",2,e); //调用Python相应的…

命令测试post_【第2088期】前端中台化,把格局做大——NodeJS 和测试服务探索

前言今日早读文章由《React状态管理与同构实战》作者LucasHC投稿分享。正文从这开始~~近些年,「NodeJS 应该如何在公司业务中真实落地 」这类问题屡见不鲜。自从 2009 年 NodeJS 诞生之后,抢尽风头,圈粉无数。但一定有工程师不禁要质疑「Node…

Go类型转换

由于Go语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明。 string、int、float类型相互转换 string转其他 string转成int: int, err : strconv.Atoi(string) string转成int64: // 参数1:带转换字符串,/…

linux tee 重定向_快乐的linux命令行-重定向

整理自《快乐的linux命令行一书》。linux系统版本: Ubuntu 17.04本章,我们将介绍命令行最酷的特性,叫做I/O重定向,通过这个工具,可以重定向命令的输入输出,命令的输入来自文件,而输出也存到文。…

Java 诊断工具 Arthas 常见命令

基本概念 云原生这么多微服务,当然需要一个诊断利器来排查问题。 Arthas 是阿里开源的 Java 诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪 Java 代码;实时监控 JVM 状态。Arthas 支持 JDK 6&#xff0c…

28和lba48命令格式区别_编译Sass(命令行)

本文作者:开课吧无忧图文编辑:开三金sass编译有很多种方式,如命令行编译模式、编辑器自动编译、编译软件koala、sass-loader等。今天我们就先来看第一种:命令行编译刚才我在test文件夹里面已经建立了一个style.scss文件&#xff0…

JAVA基础编程代码50个

【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析: 兔子…

爬虫软件python功能_Python 网络爬虫程序详解

#!/usr/bin/python #调用pythonfrom sys import argv #导入sys是导入python解释器和他环境相关的参数from os import makedirs,unlink,sep  #os主要提供对系统路径,文件重命名和删除文件所需的函数#makedirs是创建递归文件夹的函数。#比如说我们要创建一个新的目录…

价钱转换python_如何在python中转换货币?

我正在做一个虚拟助手项目。我想让它告诉我其他货币的美元汇率。我用beauthoulsoup编写了以下代码,它从给定的网站获取数据,对其进行解析并在命令行中打印结果供我阅读。但这只是美元对巴基斯坦卢比。如何修改程序,使其接受任何货币并告诉我该…

char qt 转unicode_Qt QString 中文 char* UTF-8 QByteArray QTextCodec unicode gb2312 GBK 乱码与转码问题...

2012-03-22 14:00175人阅读评论(0)代码如下:如果不不设全局的字符集是utf-8,那么网上一般的方法是可以转的。如下程序中 #define DD 1的情况下;但是如果设置了全局的utf-8,再用以前的方法:QByteArraybaaaa.toLatin1();…