题目描述:
题号:543
给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root
。
两节点之间路径的 长度 由它们之间边数表示。
解题思路:
思路一:深度优先搜索
-
深度优先搜索(DFS):使用DFS算法遍历二叉树。在遍历过程中,对于每个节点,都会递归地计算其左子树和右子树的最大深度。
-
记录每个节点的最大深度:在DFS遍历的过程中,记录从当前节点出发能够达到的最远叶子节点的距离,即当前节点的最大深度。
-
计算直径:二叉树的直径定义为树中任意两个节点之间最长路径的长度。在DFS遍历过程中,通过比较和更新每个节点的最大深度,可以找到整棵树中的最长路径,即二叉树的直径。
时间复杂度:O(N)
空间复杂度:O(H) H 为二叉树高度
C++
// 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 {
private:
int max;
//DFS
int DFS(TreeNode* root) {
//递归结束条件
if(root == nullptr) {
return 0;
}
//最深左子树+最深右子树为节点直径
int deep_left = DFS(root->left) ;
int deep_right = DFS(root->right);
if(deep_left + deep_right + 1 > max) {
max = deep_left + deep_right;
}
return std::max(deep_left, deep_right) + 1;
}
public:
int diameterOfBinaryTree(TreeNode* root) {
this->max = 0;
DFS(root);
return max;
}
};
go
// go
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func diameterOfBinaryTree(root *TreeNode) int {
var depth func(*TreeNode) int
answer := 0
depth = func(root *TreeNode) int {
if root == nil {
return 0
}
left := depth(root.Left)
right := depth(root.Right)
answer = max(answer, left+right)
return max(left, right) + 1
}
depth(root)
return answer
}