543. 二叉树的直径

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。

示例 :
给定二叉树

          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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值