解题思路
其实一个非常暴力的方法就是将每个节点都当做根节点,然后求左右子树的高度,相加。最后取最大值即可。
但其实这样的n^2 暴力,可以优化到o(n).
方法是利用回溯:当dfs的时候,记录当前节点的高度。回溯的时候,判断以当前节点为根的最大直径是多少即可。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int ans;
int diameterOfBinaryTree(TreeNode* root) {
ans=0;
dfs(root,0);
return ans;
}
int dfs(TreeNode *root,int hight)
{
if(root==NULL) return hight;
int lh=hight,rh=hight;
if(root->left)
{
lh=dfs(root->left,lh+1);
}
if(root->right)
{
rh=dfs(root->right,rh+1);
}
ans=max(ans,lh-hight+rh-hight);
return max(lh,rh);
}
};