递归
最大直径=最大左节点数+最大右节点数-1(要-1是因为求的直径是指这段路的边,边数=节点数-1 )
要注意一个点就是记录最大直径的那个变量n要定义在函数外面!!!
以这张图为例:
从根节点出发,分别从它的左节点和右节点向下,比方说左节点一路向下走到叶子节点4,此时4没有孩子,将4看成是本次函数的root:
int deft(TreeNode* root){
if(root==NULL){
return 0; //a
}
int l=deft(root->left); //b
int r=deft(root->right); //c
n=max(l+r,n);
return max(l,r)+1; //d
}
a:4!=null,所以还没有返回
b:此时执行dept(4->left)时,由于4->left=null,则return 0,b结束
c:此时执行dept(4->right)时,由于4->right=null,也return 0,c结束
d:return max(0,0)+1即return 1
此时以4为root的函数已完整执行完,即dept(2->left)已执行完毕,接下来执行dept(2->right)同上
所以可以理解成找到直接走到最深的地方再开始往回一步一步计数,其中dept函数return的值代表当前root的全部孩子都已经被遍历完成了,返回的这个值记录着从当前root出发的最长路径
/**
* 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 n=0; //不能定义在函数内!!!
int diameterOfBinaryTree(TreeNode* root) {
deft(root);
return n;
}
int deft(TreeNode* root){
if(root==NULL){
return 0;
}
int l=deft(root->left);
int r=deft(root->right);
n=max(l+r,n); //n是记录最大直径的,最大直径是最大左边节点数+最大右边节点数-1,所以是比较l+r
return max(l,r)+1; //走到这里意味着有一个节点它的左右孩子都遍历结束了,此时+1代表的是它本身;记录着从当前root出发的最长路径
}
};