【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.总结

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

你可能感兴趣的:(Leetcode算法)