该直径可能经过根节点,也可能不经过根节点
1.深度优先搜索
一条路径的长度为该路径经过的节点数减1,求直径等于从当前节点出发到达叶子节点所经过的节点数的最大值减1.就本题而言,设max记录当前的最大直径,然后遍历树中的每一个节点,求其左右子树的最大直径。
代码如下:
/**
* 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 {
int max=0;
public:
int diameterOfBinaryTree(TreeNode* root) {
//难点在于最长路径不一定经过原点
if(root==NULL)
return 0;
depth(root);
return max;
}
int depth(TreeNode *root)
{
if(root!=NULL)
{
int left=depth(root->left);//计算当前节点的左子树
int right=depth(root->right);//计算当前节点的右子树
if(left+right>max)//若最大直径由当前节点的左右子树构成,与此时的max比较
max=left+right;
return left>right?left+1:right+1;//返回当前节点左右子树中直径的最大值,回溯
}
return 0;
}
};