原题
LeetCode 543. 二叉树的直径
思路
- 二叉树的直径可以理解为 一个结点的左右子树的高度和+1的最大值所经过的那条路,即height(root->left)+height(root->right)+1,不过这个值统计的是这条路的节点数,这条路的直径值是节点数-1。
代码
class Solution {
public:
int maxL = 0;
int heightofTree(TreeNode* root) {
if (root == nullptr) return 0;
int l = heightofTree(root->left);
int r = heightofTree(root->right);
maxL = max(maxL, l + 1 + r);
return max(l, r) + 1;
}
int diameterOfBinaryTree(TreeNode* root) {
int maxheight = heightofTree(root);
return maxL - 1;
}
};
运行截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0b60da4f3a06c0897bb0f7d23c9a6c7f.png)
收获
- 这里值得注意的是,当有递归关系的时候,如果一个递归重复出现,请用变量来存储该递归的结果,不然会超时。如下:
class Solution {
public:
int maxL = 0;
int heightofTree(TreeNode* root) {
if (root == nullptr) return 0;
maxL = max(maxL, heightofTree(root->left) + 1 + heightofTree(root->right));
return max(heightofTree(root->left), heightofTree(root->right)) + 1;
}
int diameterOfBinaryTree(TreeNode* root) {
int maxheight = heightofTree(root);
return maxL-1;
}
};