【Leetcode】543. Diameter of Binary Tree(Easy)

1.题目

Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or may not pass through the root.

Example:
Given a binary tree 

          1
         / \
        2   3
       / \     
      4   5    

Return 3, which is the length of the path [4,2,1,3] or [5,2,1,3].

Note: The length of path between two nodes is represented by the number of edges between them.

翻译:给定一个二叉树,你需要计算出二叉树的直径长度。二叉树直径的长度就是树中任意两节点间的最长长度。这个路径可能经过根节点也可能不经过。

注意:两个节点间的路径长度表示为它们之间的边数。

2.思路

最远的路径,两端一定是两个叶子节点,且该两个节点必有公共祖先(所有的节点均是由根节点出发的)。所以依次遍历每一个可能的祖先(即遍历每个节点),看其最多能延伸到什么程度。此题我采用先序遍历。

对每一个节点来说,它能延伸的长度取决于它的左右孩子,如果它没有左右孩子,则长度为0;

①如果只有左孩子,则它能延伸的长度为其 右孩子的深度+1;(+1为该节点与右孩子之间的边长度)。

②如果只有右孩子,则它能延伸的长度为其 左孩子的深度+1

③如果左右孩子都有,则它能延伸的长度为 左孩子的深度+1+右孩子的深度+1

取所有节点中延伸长度最大的数,即为二叉树的直径长度。

3.算法 
    private int max=0;
    
    public int diameterOfBinaryTree(TreeNode root) {
        if(root==null)return 0;
        if(root.left==null&&root.right==null)return 0;
        
        int temp=0;
        if(root.left==null) temp=deepOfNode(root.right)+1;
        else if(root.right==null) temp=deepOfNode(root.left)+1;
        else temp=deepOfNode(root.left)+deepOfNode(root.right)+2;
        
        max=max>temp?max:temp;
        diameterOfBinaryTree(root.left);
        diameterOfBinaryTree(root.right);
        return max;
    }

    private int deepOfNode(TreeNode root){
        if(root==null)return 0;
        if(root.left==null&&root.right==null)return 0;
        int leftDepth=deepOfNode(root.left);
        int rightDepth=deepOfNode(root.right);
        return 1+(leftDepth>rightDepth?leftDepth:rightDepth);
    }

4.总结

       还是一样,有二叉树想递归,想遍历。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值