二叉树的直径

server/2024/9/24 11:02:50/

题目描述:给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示。

示例 1:

img

输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

提示:

  • 树中节点数目在范围 [1, 104]

  • -100 <= Node.val <= 100

way:任意一条从一个节点到另一个节点的直径的节点数都可以看成是从一个节点出发,加上它的左子树的深度和右子树的深度,所以可以后序得到每一个节点的这样的值然后取max就是节点数的最大值,那么直径就是节点数-1。时间复杂度O(n),空间复杂度O(h)。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int ans = -1;int getNodeDepth(TreeNode * root){if(root == nullptr) return 0;int left = getNodeDepth(root->left);int right = getNodeDepth(root->right);ans = max(ans, left + right + 1);return max(left, right) + 1;}int diameterOfBinaryTree(TreeNode* root) {getNodeDepth(root);return ans -1;}
};

way:如果是求以x为根节点的二叉树的直径的话,那么这条直径可能经过x,也可能不经过x,如果这条直径经过x,那么直径的节点数就是左子树的深度+右子树的深度+1,如果这条直径不经过x,那么直径的节点数就是x的左子树中距离最远的2个节点之间的节点数或者右子树中距离最远的2个节点之间的节点数,这么看的话,如果x想要向左右子树分别要信息然后得到自身信息返回的话,需要的信息有树上最远的2个节点之间的节点数(也就是直径的节点数),树的高度。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/struct Info{int maxDis;int height;Info(int maxDis, int height){this->maxDis = maxDis;this->height = height;}
};class Solution {
public:Info getInfo(TreeNode * root){if(root == nullptr) return Info(0,0);Info left = getInfo(root->left);Info right = getInfo(root->right);int height = max(left.height, right.height) +1;int maxDis;int p1 = left.height+right.height+1;int p2 = left.maxDis;int p3 = right.maxDis;maxDis = max(p1, max(p2, p3));return Info(maxDis, height);}int diameterOfBinaryTree(TreeNode* root) {return getInfo(root).maxDis -1;}
};

我说的二叉树的深度和高度指的都是节点数,比如一个节点的二叉树的深度和高度都是1,不是指边的长度。


http://www.ppmy.cn/server/32103.html

相关文章

深度剖析muduo网络库1.1---面试提问(阻塞、非阻塞、同步、异步)

在面试过程中&#xff0c;如果被问到关于IO的阻塞、非阻塞、同步、异步时&#xff0c;我们应该如何回答呢&#xff1f; 结合最近学习的课程&#xff0c;我作出了以下的总结&#xff0c;希望能与大家共同探讨&#xff01; 先给出 陈硕大神原话&#xff1a;在处理IO的时候&…

【C++】---模板进阶

【C】---模板进阶 一、模版参数1、类型参数2、非类型参数 二、模板的特化1、函数模板的特化2、类模板特化&#xff08;1&#xff09;全特化&#xff08;2&#xff09;偏特化 三、模板分离编译1、模板支持分离编译吗&#xff1f;2、为什么模板不支持分离编译&#xff1f;3、如何…

数据库 和 SQL 和 索引事务 和 Java数据库编程(JDBC)

一、初识数据库 什么是数据库&#xff1f;和数据结构有什么关系&#xff1f; 数据库是“一类软件”&#xff0c;能够针对数据进行管理。数据结构&#xff0c;也是针对数据进行管理。所以&#xff0c;数据库其实就是一个“基于数据结构”实现出来的软件。 有哪些常用数据库&…

MySQL表的增删改查

在进行表操作之前,一定要use选中数据库 注释&#xff1a;在SQL中可以使用 --空格描述 来表示注释说明 CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母。 文章目录 数据库约束约束类型NOT NULL约束UNIQUE&#xff1a;唯一约束DEFAULT&…

int类型的取值范围(为什么负数比正数表示的范围多一位)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C语言基本概念 &#x1f337;追光的人&#xff0c;终会万丈光芒 目录 &#x1f3dd;1.int的基本概念&#xff1a; 空间大小&#xff1a; 有符号类型的表示形式&#xff1a; &#x1f3dd;2.…

【Linux】进程等待

思维导图 学习目标 进程等待的必要性进程等待的方法wait函数和waitpid函数的学习参数status的介绍 一、进程等待的必要性 1.1 进程等待是什么&#xff1f; 任何子进程&#xff0c;在退出的情况下&#xff0c;一般都必须让父进程进行等到&#xff0c;进程在退出的时候&#x…

使用RTSP将笔记本摄像头的视频流推到开发板

一、在Windows端安装ffmpeg 1. 下载ffmpeg:下载ffmpeg 解压ffmpeg-master-latest-win64-gpl.zip bin 目录下是 dll 动态库 , 以及 可执行文件 ;将 3 33 个可执行文件拷贝到 " C:\Windows " 目录下 ,将所有的 " .dll " 动态库拷贝到 " C:\Windows\Sy…

001 springCloudAlibaba 负载均衡

文章目录 orderServerOrderController.javaProductClient.javaOrderServerApplication.javaServletInitializer.javaapplication.yamlpom.xml productServerProductController.javaProduct.javaProductServerApplication.javaServletInitializer.javaapplication.yamlpom.xml p…