热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:力扣543:二叉树的直径C++

篇首语:本文由编程笔记#小编为大家整理,主要介绍了力扣543:二叉树的直径C++相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了力扣543:二叉树的直径C++相关的知识,希望对你有一定的参考价值。






题目

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。


分析

这道题的难度在LeetCode上被归为简单,但我觉得这道题无论是思路上还是代码的写法上,还有具有中等难度的程度的。

这道题要求我们计算直径长度,首先我们要将求直径长度转换成一个好求的量,笔者将求直径长度转换为求二叉树的高度。这个其实是不难理解的,因为直径其实就是经过边的个数,每经过一条边,相当于高度增加1。

但是题中说明了这条路径可能穿过根结点,因此最长的路径显然是左子树的高度+右子树的高度。

分析到这里,可能有的小伙伴会想,那这个不难呀,我用递归的方法求出左子树的高度和右子树的高度,返回它们之和就是题解了。于是写出这样的代码:

class Solution {
public:
int diameterOfBinaryTree(TreeNode* root) {
if(!root)return 0;
int left=GetHeight(root->left);//求左子树高度
int right=GetHeight(root->right);//求右子树高度
return left+right;
}
int GetHeight(TreeNode* root){//递归求解高度
if(!root)return 0;
return 1+max(GetHeight(root->left),GetHeight(root->right));
}
};

虽然思路是正确的,但是这样由于少考虑了一种情况而导致部分用例会出现错误。
在这里插入图片描述

比如这个用例,按照上述代码的话,输出的答案是左子树高度1+右子树高度6=7。然而其最大路径实际上是以第三层-9这个父结点作为根结点时,此时左子树高度4+右子树高度=8。这就要求我们要结合后序遍历,实现从下往上求出每个父结点作为根结点时,左右子树高度和,并与下次求出的值作比较,保留较大值。

按照这个思路,就可以写代码了。


代码

class Solution {
int maxlength=INT_MIN;//定义一个存储最大路径的变量
public:
int diameterOfBinaryTree(TreeNode* root) {
if(!root)return 0;
dfs(root);//后序dfs
return maxlength;
}
int GetHeight(TreeNode* root){//求root高度的函数
if(!root)return 0;
return 1+max(GetHeight(root->left),GetHeight(root->right));
}
void dfs(TreeNode* root){
if(!root)return;
dfs(root->left);
dfs(root->right);
maxlength=max(maxlength,GetHeight(root->left)+GetHeight(root->right));//将maxlength与当前父结点左右子树高度和比较,保留较大值
}
};





推荐阅读
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
author-avatar
qaz9
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有