【LeetCode】543. 二叉树的直径

543. 二叉树的直径(简单)

在这里插入图片描述

【LeetCode】543. 二叉树的直径_第1张图片

【LeetCode】543. 二叉树的直径_第2张图片

思路

  • 对于任一结点,以此结点为根的diameter就可以表示为左子树高度 + 右子树高度,而二叉树的diameter就是所有结点为根的diameter中最大的那个。
  • 因此,变量 maxLen 用来保存当前遍历过的节点的最大直径,初始化为 0 。在每获得一个节点的左子树和右子树的值的时候,都需要将其和 「左子树高度+右子树高度的大小」进行比较,把更大的保存下来 。
  • 如何求左子树和右子树的高度呢,那就是经典的递归求高度问题max(height(root.left), height(root.right))+1

代码

/**
 * 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 maxLen = 0;
    int diameterOfBinaryTree(TreeNode* root) {
        if(root == nullptr) return 0;
        height(root);
        return maxLen; 
    }
    // height 返回root的高度
    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; 
    }
};

你可能感兴趣的:(LeetCode刷题,leetcode,算法,职场和发展)