一种比较好的思路是。随便找一个点(一般取根节点),找到这棵树中,距离这个点最远的点,再从找到的这个点开始,找到距离它最远的点。这种思路是带有很强烈的数学成分。证明可自行解决。
b站大佬是用动归来做的,我不是很好理解。
这里给出一种基础做法,即借助求二叉树的深度的方式。对于每一个节点,求其左右子树的最大深度,然后对于每一个子节点的左右深度加和,与一个统计树的直径的全局变量作比较,如果该节点的左右子树深度和大于他们,则更新结果。
class Solution {
public:
int ret=0;
int shendu(TreeNode* root)
{
if(root==NULL) return 0;
int lheight=shendu(root->left);
int rheight=shendu(root->right);
ret=max(lheight+rheight,ret);
return max(lheight,rheight)+1;
}
int diameterOfBinaryTree(TreeNode* root) {
shendu(root);
return ret;
}
};