问题
思路
刚上来的时候做错了,因为觉得二叉树的直径一定要经过root。所以我求出了左右子树的深度,加起来获得答案。
思路是不对的,因为直接可能是不经过root的。这点很重要。
那么我的思路是,对于每一个节点,就出经过他的最大直径。
然后,二叉树的直接就是这些当中最大的。
代码
/**
* 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 diameterOfBinaryTree(TreeNode* root) {
if(!root) return 0;
else{
int max = 0;
dfs(root, max);
return max;
}
}
private:
int depth(TreeNode* root){
if(!root) return 0;
else return std::max( depth(root->left), depth(root->right) ) + 1;
}
int helper(TreeNode* root){//经过root的最大直径
if(!root) return 0;
else return depth(root->left) + depth(root->right);
}
void dfs(TreeNode* root, int& ans){
if(!root) return;
else{
int tmp = helper(root);
ans = std::max(ans, tmp);
dfs(root->left, ans);
dfs(root->right, ans);
}
}
};