精选力扣500题 第50题 LeetCode 543. 二叉树的直径c++详细题解
Posted 林深时不见鹿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精选力扣500题 第50题 LeetCode 543. 二叉树的直径c++详细题解相关的知识,希望对你有一定的参考价值。
1、题目
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 :
给定二叉树
1
/ \\
2 3
/ \\
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意: 两结点之间的路径长度是以它们之间边的数目表示。
2、思路
(递归,树的遍历) O ( n ) O(n) O(n)
在这道题目中,路径是指从树中某个节点开始,沿着树中的边走,走到某个节点为止,路过的所有边的个数。直径指的是二叉树路径长度中的最大值。
对于一棵树,我们可以将其划分为很多的子树,如下图所示,虚线矩形围起来的子树。我们把这颗子树的蓝色节点称为该子树最高节点。用最高节点可以将整条路径分为两部分:从该节点向左子树延伸的路径,和从该节点向右子树延伸的路径。
因此对于任何一棵树,它里面的任何一条路径一定存在一个最高点。所以只要枚举树里面的每个节点作为最高点,然后比较以该节点作为最高点的左子树和右子树的最大高度之和,取其中的最大值,就是二叉树的直径。
递归函数的返回值定义为当前这颗子树的最大高度。
递归过程:
1、首先递归左右子树,求出左右子树的最大高度,我们记为lh
,rh
。
2、枚举树里面的每个节点作为最高点,然后比较以该节点作为最高点的左子树和右子树的最大高度之和(lh
+ rh
),取其中的最大值。
3、具体实现细节看代码。
时间复杂度分析: O ( n ) O(n) O(n),其中 n n n 为二叉树的节点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。
3、c++代码
/**
* 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 res = 0;
int diameterOfBinaryTree(TreeNode* root) {
dfs(root);
return res;
}
int dfs(TreeNode* root) //递归求一棵树的最大高度
{
if(!root) return 0;
int lh = dfs(root->left), rh = dfs(root->right);
res = max(res, lh + rh);
return max(lh,rh) + 1;
}
};
4、java代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int res = 0;
public int diameterOfBinaryTree(TreeNode root) {
dfs(root);
return res;
}
public int dfs(TreeNode root) //递归求一棵树的最大高度
{
if(root == null) return 0;
int lh = dfs(root.left) , rh = dfs(root.right);
res = Math.max(res, lh + rh);
return Math.max(lh , rh) + 1;
}
}
原题链接: 543. 二叉树的直径
以上是关于精选力扣500题 第50题 LeetCode 543. 二叉树的直径c++详细题解的主要内容,如果未能解决你的问题,请参考以下文章
精选力扣500题 第50题 LeetCode 543. 二叉树的直径c++详细题解
精选力扣500题 第19题 LeetCode 199. 二叉树的右视图c++详细题解
精选力扣500题 第20题 LeetCode 704. 二分查找c++详细题解
精选力扣500题 第8题 LeetCode 160. 相交链表 c++详细题解