给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。
示例 :
给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示。
思考:开始看了题目觉得很简单,直接向着:弄一个递归函数,求左子树和右子树最大深度,加起来不就对了。后来提交发现错了,然后仔细思考了一下,才发现,如果你这个树是个歪脖子树,一直歪左边,然后右边没结点,但是左子树的右半侧又有很深。画个图说明。就是:人家完全可以不过根结点!这样的话简单左子树加右子树就出问题了!额~设置一个最大直径就可以解决了。
代码如下:
int BinaryTreeDepth(TreeNode* node,int &res/*表示当前二叉树最大直径*/){
if(!node) return 0;
int leftDepth = BinaryTreeDepth(node->left,res);
int rightDepth = BinaryTreeDepth(node->right,res);
res = max(res,leftDepth + rightDepth);
return max(leftDepth,rightDepth) + 1;
}
class Solution {
public:
int diameterOfBinaryTree(TreeNode* root) {
if(!root) return 0;
int res = 0;
BinaryTreeDepth(root,res);
return res;
}
};
总结下:这种比较简单就求一个最大路径和,如果是就路径感觉也是深搜策略把。让自己重新熟悉了一下:如何求二叉树的深度。有一点还是经常错:总是把判断停止的条件弄成下面这样,实际上不对。如果你传入的就是一个空结点呢?(这个解释仅仅是为了方便记忆,哈哈)
if(!root->left && !root->right)