543. Binary Tree Paths(二叉树的直径)
Given the root
of a binary tree, return the length of the diameter of the tree.
The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or may not pass through the root
.
The length of a path between two nodes is represented by the number of edges between them.
Example 1:
Input: root = [1,2,3,null,5]
Output: ["1->2->5","1->3"]
Example 2:
Input: root = [1]
Output: ["1"]
问题描述
给定一棵二叉树的根节点 root
,返回这棵树的直径长度。二叉树的直径是指树中任意两个节点间最长路径的长度。这个路径可能穿过也可能不穿过根节点。两个节点之间的路径长度由它们之间的边数表示。
方法思路
我们可以使用 深度优先搜索(DFS) 来递归地计算每个节点的左右子树的最大深度,并在过程中更新最大直径。直径的长度可以看作是左子树的深度加上右子树的深度(即穿过当前节点的最长路径)。
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 diameterOfBinaryTree(TreeNode* root) {
int diameter = 0;
height(root, diameter);
return diameter;
}
private:
int height(TreeNode* node, int& diameter) {
if (!node) return 0;
int leftHeight = height(node->left, diameter);
int rightHeight = height(node->right, diameter);
// 更新直径
diameter = max(diameter, leftHeight + rightHeight);
// 返回当前节点的高度
return 1 + max(leftHeight, rightHeight);
}
};
复杂度分析
- 时间复杂度: O ( N ) O(N) O(N),其中 N N N 是二叉树的节点数。每个节点只被访问一次。
- 空间复杂度: O ( H ) O(H) O(H),其中 H H H 是二叉树的高度。递归调用的栈空间取决于树的高度,最坏情况下(树退化为链表)为 O ( N ) O(N) O(N)。