543. 二叉树的直径 - 力扣(LeetCode) (leetcode-cn.com)
首先我们知道一条路径的长度为该路径经过的节点数减一,所以求直径(即求路径长度的最大值)等效于求路径经过节点数的最大值减一。
而任意一条路径均可以被看作由某个节点为起点,从其左儿子和右儿子向下遍历的路径拼接得到。
用递归来计算左右孩子向下遍历的深度。
/**
* 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 ans;
//求深度
int getDepth(TreeNode* node) {
if(node == NULL) return 0;
int left = getDepth(node->left); //左孩子的深度
int right = getDepth(node->right); //右孩子的深度
ans = max(ans, left + right + 1); //更新
return max(left, right) + 1;
}
public:
int diameterOfBinaryTree(TreeNode* root) {
ans = 1;
getDepth(root);
return ans - 1; //路径数比节点数少一
}
};