给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root
。
两节点之间路径的 长度 由它们之间边数表示。
示例 1:
输入:root = [1,2,3,4,5] 输出:3 解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。
这个题目里面讲可以经过根节点也可以不经过根节点
一条路径的长度等于经过的节点数减去1,所以求直径就等效于求路径经过节点的最大值减去1
任意一个路径可以看作以某个节点为起点,从其左孩子到右孩子向下遍历的路径拼接得到
//二叉树的直径
class Solution
{
public:
int ans;
int depth(TreeNode* node)
{
if (node == NULL)return 0; //访问到空节点了,返回0
int L = depth(node->left); //求节点左边子树的深度
int R = depth(node->right); //求节点右边子树的深度
ans = max(ans, L + R + 1); //以该节点为起点的路径经过节点数的最大值即为 L+R+1
return max(L, R) + 1; //以该节点为根的子树的深度就是max(L+R)+1
}
int diamter(TreeNode* root)
{
ans = 1;
depth(root);
return ans - 1;
}
};