zoukankan      html  css  js  c++  java
  • 二叉树的直径

    题目

    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
    
    
  • 相关阅读:
    Pytorch对比clone、detach以及copy_等张量复制操作【转】
    最简单的appium程序
    无线连接adb
    adb命令
    appium环境搭建
    fiddler修改请求以及返回,mock返回
    request库上传文件
    jmeter关于cookie提取问题
    cookie的操作
    下拉框元素定位
  • 原文地址:https://www.cnblogs.com/flyingcr/p/10698547.html
Copyright © 2011-2022 走看看