543.二叉树的直径
递归!又是递归!我恨!
(关于期末考试没有输出的痛苦回忆.......

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 };
解题思路
为了找到二叉树的直径,我们需要找到任意两个节点之间的最长路径。这条路径不一定经过根节点,可能完全位于左子树或右子树中,也可能跨越根节点。
观察直径的构成:
-
对于任何一个节点,经过该节点的最长路径的长度是其左子树的深度加上右子树的深度。
-
因为可以从左子树的最深节点,经过当前节点,再到右子树的最深节点。
-
-
因此,我们需要计算每个节点的左子树深度和右子树深度之和,并记录其中的最大值。
-
同时,我们需要递归地计算每个子树的深度,以便在父节点中使用。
具体步骤:
-
初始化一个变量
max_diameter用来记录当前找到的最大直径。 -
定义一个递归函数
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(因为深度是从当前节点到最远叶子节点的边数)。
-
-
从根节点开始调用
depth(root),max_diameter即为所求的直径。

浙公网安备 33010602011771号