543.二叉树的直径

543. 二叉树的直径 - 力扣(LeetCode)

递归!又是递归!我恨!

(关于期末考试没有输出的痛苦回忆.......

 

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10  * };
11  */
12 class Solution {
13 public:
14     int diameterOfBinaryTree(TreeNode* root) {
15         int max_diameter = 0;
16         depth(root, max_diameter);
17         return max_diameter;
18     }
19 
20     int depth(TreeNode* node, int& max_diameter) {
21         if (node == nullptr) {
22             return 0;
23         }
24         int left_depth = depth(node->left, max_diameter);
25         int right_depth = depth(node->right, max_diameter);
26         max_diameter = max(max_diameter, left_depth + right_depth);
27         return max(left_depth, right_depth) + 1;
28     }
29 };

解题思路

为了找到二叉树的直径,我们需要找到任意两个节点之间的最长路径。这条路径不一定经过根节点,可能完全位于左子树或右子树中,也可能跨越根节点。

观察直径的构成:

  • 对于任何一个节点,经过该节点的最长路径的长度是其左子树的深度加上右子树的深度。

    • 因为可以从左子树的最深节点,经过当前节点,再到右子树的最深节点。

  • 因此,我们需要计算每个节点的左子树深度和右子树深度之和,并记录其中的最大值。

  • 同时,我们需要递归地计算每个子树的深度,以便在父节点中使用。

具体步骤:

  1. 初始化一个变量 max_diameter 用来记录当前找到的最大直径。

  2. 定义一个递归函数 depth(node) 来计算以 node 为根的子树的深度:

    • 如果 node 是 nullptr,深度为 0。

    • 否则,左子树的深度为 left_depth = depth(node->left)

    • 右子树的深度为 right_depth = depth(node->right)

    • 当前节点的直径(即经过当前节点的最长路径)为 left_depth + right_depth

    • 更新 max_diameter 为 max(max_diameter, left_depth + right_depth)

    • 返回当前子树的深度:max(left_depth, right_depth) + 1(因为深度是从当前节点到最远叶子节点的边数)。

  3. 从根节点开始调用 depth(root)max_diameter 即为所求的直径。

 

posted @ 2025-04-16 17:09  xzdmzrc  阅读(17)  评论(0)    收藏  举报