递归
- 递归获得节点左子树的最大节点数
- 递归获得节点右子树的最大节点数
- 当前节点的最大节点数:左子树最大节点数 + 右子树最大节点数 + 1
- 当前节点的最大直径:最大节点数 - 1
- 递归边界条件:节点为空
- 递归返回:max(左子树节点数,右子树节点数) + 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 {
int max_res = 0;
public:
int dfs(TreeNode* root)
{
// 边界返回
if(!root)
return 0;
int left = dfs(root->left); // 左子树的最大节点数
int right = dfs(root->right); // 右子树的最大节点数
max_res = max(max_res, left + right); // 当前树的最大节点数:left + right + 1,共有left + right条边
return 1 + max(left, right); // 返回当前节点的最大节点数
}
int diameterOfBinaryTree(TreeNode* root) {
dfs(root);
return max_res;
}
};