• 二叉树的直径


    题目

    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.

    简洁代码

      public int diameterOfBinaryTree(TreeNode root) {
            if(root == null) return 0;
            //左右子树的深度之和
            int diameter = getDepth(root.left) + getDepth(root.right);
            //返回左子树、右子树、左右子树的深度之和中的最大值
            return Math.max(diameter,Math.max(diameterOfBinaryTree(root.left),diameterOfBinaryTree(root.right)));
        }
        //求树的深度
        public int getDepth(TreeNode root){
            if(root == null) return 0;
            return Math.max(getDepth(root.left),getDepth(root.right)) + 1;
        }
    

    过程分析

    public class TreeDiemiter {
    
        static class TreeNode{
            TreeNode left = null;
            TreeNode right = null;
            int val = 0;
    
            public TreeNode(int val) {
                this.val = val;
            }
        }
    
        public int diameterOfBinaryTree(TreeNode root) {
            if(root == null) return 0;
            //左右子树的深度之和
            int diameter = getDepth(root.left) + getDepth(root.right);
            //返回左子树、右子树、左右子树的深度之和中的最大值
            return Math.max(diameter,Math.max(diameterOfBinaryTree(root.left),diameterOfBinaryTree(root.right)));
        }
        //求树的深度
        public int getDepth(TreeNode root){
            if(root == null) return 0;
            return Math.max(getDepth(root.left),getDepth(root.right)) + 1;
        }
        /*另外一种写法求树的深度
          public int TreeDepth(TreeNode root) {
             if(root == null) return 0;
            int leftDepth = TreeDepth(root.left);
            int rightDepth = TreeDepth(root.right);
            return leftDepth > rightDepth? leftDepth + 1:rightDepth + 1;//这里要加1的原因是深度数的是节点的个数
        }*/
    
        public static void main(String[] args){
            TreeDiemiter.TreeNode treeNode = new TreeDiemiter.TreeNode(1);
            treeNode.left = new TreeDiemiter.TreeNode(2);
            treeNode.right = new TreeDiemiter.TreeNode(3);
            treeNode.left.left = new TreeDiemiter.TreeNode(4);
            treeNode.left.right = new TreeDiemiter.TreeNode(5);
            TreeDiemiter treeDiemiter = new TreeDiemiter();
            int res = treeDiemiter.diameterOfBinaryTree(treeNode);
            System.out.println(res);
    
        }
    }
    
    
    public class TreeDiemiter {
    
        static class TreeNode{
            TreeNode left = null;
            TreeNode right = null;
            int val = 0;
    
            public TreeNode(int val) {
                this.val = val;
            }
        }
    
        public int diameterOfBinaryTree(TreeNode root) {
            System.out.println("=====================");
            if(root == null) return 0;
            //左右子树的深度之和
            int leftDepth = getDepth(root.left);
            System.out.println("leftDepth:" + leftDepth);
            int rightDepth = getDepth(root.right);
    
            System.out.println("rightDepth:" + rightDepth);
            int diameter = leftDepth + rightDepth;
            System.out.println("diameter:" + diameter);
            //返回左子树、右子树、左右子树的深度之和中的最大值
            return Math.max(diameter,Math.max(diameterOfBinaryTree(root.left),diameterOfBinaryTree(root.right)));
        }
        //求树的深度
        public int getDepth(TreeNode root){
            if(root == null) return 0;
            return Math.max(getDepth(root.left),getDepth(root.right)) + 1;
        }
    
        public static void main(String[] args){
            TreeDiemiter.TreeNode treeNode = new TreeDiemiter.TreeNode(1);
            treeNode.left = new TreeDiemiter.TreeNode(2);
            treeNode.right = new TreeDiemiter.TreeNode(3);
            treeNode.left.left = new TreeDiemiter.TreeNode(4);
            treeNode.left.right = new TreeDiemiter.TreeNode(5);
            TreeDiemiter treeDiemiter = new TreeDiemiter();
            int res = treeDiemiter.diameterOfBinaryTree(treeNode);
            System.out.println(res);
    
        }
    }
    
    
    
    =====================
    leftDepth:2
    rightDepth:1
    diameter:3
    =====================
    leftDepth:1
    rightDepth:1
    diameter:2
    =====================
    leftDepth:0
    rightDepth:0
    diameter:0
    =====================
    =====================
    =====================
    leftDepth:0
    rightDepth:0
    diameter:0
    =====================
    =====================
    =====================
    leftDepth:0
    rightDepth:0
    diameter:0
    =====================
    =====================
    3
    
    Process finished with exit code 0
    
    
  • 相关阅读:
    Hello CnBlog
    boxshadow
    箭头函数
    Web存储机制
    闭包
    HTTP Cookie
    javascript执行环境和作用域链
    BFC
    iOS开发之创建颜色渐变视图View
    iOS之中国银联移动支付控件升级的问题
  • 原文地址:https://www.cnblogs.com/flyingcr/p/10698547.html
Copyright © 2020-2023  润新知