543. 二叉树的直径(简单)
思路
- 对于任一结点,以此结点为根的diameter就可以表示为左子树高度 + 右子树高度,而二叉树的diameter就是所有结点为根的diameter中最大的那个。
- 因此,变量
maxLen
用来保存当前遍历过的节点的最大直径,初始化为 0 。在每获得一个节点的左子树和右子树的值的时候,都需要将其和 「左子树高度+右子树高度的大小」进行比较,把更大的保存下来 。 - 如何求左子树和右子树的高度呢,那就是经典的递归求高度问题:
max(height(root.left), height(root.right))+1
代码
class Solution {
public:
int maxLen = 0;
int diameterOfBinaryTree(TreeNode* root) {
if(root == nullptr) return 0;
height(root);
return maxLen;
}
int height(TreeNode* root) {
if(root == nullptr) return 0;
int l = height(root->left);
int r = height(root->right);
maxLen = max(maxLen, l + r);
return max(l, r) + 1;
}
};