首页 > 编程语言 >dfs题目:平衡二叉树(java)

dfs题目:平衡二叉树(java)

时间:2024-10-21 20:50:43浏览次数:3  
标签:right TreeNode val int dfs return 二叉树 java root

平衡二叉树


题目链接:
平衡二叉树题目

题目

在这里插入图片描述

思路

用分治的思想,要想看看以root为根节点的二叉树是不是平衡二叉树,得看他的左子树和右子树是不是平衡二叉树,如果左子树和右子树都是平衡的,且root自己是平衡的,就返回true.
看节点的左子树和右子树是否平衡得计算左右子树的深度差,有涉及一个求以root为节点的二叉树的深度的方法,这个方法也是用分治的思想,以root为节点的二叉树的深度=1+max(root左子树的深度,root右子树的深度)。

开始的error代码(最后一行return的地方有误)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //功能:求以root为根的深度
    int getDeep(TreeNode root){

        if(root==null){
            return 0;
        }
        //以root为根的深度=1+以root下一层的深度(较大的子树)
        
        //先求一下root左子树的深度
        int l=getDeep(root.left);
        int r=getDeep(root.right);
        //比较一下,选大的
        if(l>r){
            return 1+l;
        }else{
            return 1+r;
        }
    }
    //函数功能:判断以root为根,判断他的左右子树是否平衡
    public boolean isBalanced(TreeNode root) {

        if(root==null)
        return true;
        //先求root的左子树的深度
        int leftDeep=getDeep(root.left);
        //再求root的右子树的深度
        int rightDeep=getDeep(root.right);
        //比较一下是否左右子树的深度差是否>1
        if(Math.abs(leftDeep-rightDeep)>1){
            return false;
        }
        return true;//错误的地方:没有考虑到root左子树和右子树是否满足平衡
    }
}

修正的代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //功能:求以root为根的深度
    int getDeep(TreeNode root){

        if(root==null){
            return 0;
        }
        //以root为根的深度=1+以root下一层的深度(较大的子树)
        
        //先求一下root左子树的深度
        int l=getDeep(root.left);
        int r=getDeep(root.right);
        //比较一下,选大的
        if(l>r){
            return 1+l;
        }else{
            return 1+r;
        }
    }
    //函数功能:判断以root为根,判断他的左右子树是否平衡
    public boolean isBalanced(TreeNode root) {

        if(root==null)
        return true;
        //先求root的左子树的深度
        int leftDeep=getDeep(root.left);
        //再求root的右子树的深度
        int rightDeep=getDeep(root.right);
        //比较一下是否左右子树的深度差是否>1
        if(Math.abs(leftDeep-rightDeep)>1){
            return false;
        }
        //当root的左子树和右子树是平衡树且root数是平衡树时才是真正的平衡树
        return isBalanced(root.left)&&isBalanced(root.right);
    }
}

标签:right,TreeNode,val,int,dfs,return,二叉树,java,root
From: https://blog.csdn.net/2301_81236660/article/details/143132051

相关文章

  • 基于Java+Jsp+Ssm+Mysql实现的在线乡村风景美食景点旅游平台功能设计与实现十五
    一、前言介绍:1.1项目摘要乡村风景美食旅游平台的课题背景主要基于我国旅游产业的现状与发展需求。当前,我国旅游产业虽然发展迅速,但仍然存在基础薄弱、管理手段滞后、信息化程度低等问题。旅游行政管理部门的管理方式相对落后,缺乏有效的信息化管理手段,信息沟通渠道不畅,这......
  • 基于Java+Jsp+Ssm+Mysql实现的在线乡村风景美食景点旅游平台功能设计与实现十六
    一、前言介绍:1.1项目摘要乡村风景美食旅游平台的课题背景主要基于我国旅游产业的现状与发展需求。当前,我国旅游产业虽然发展迅速,但仍然存在基础薄弱、管理手段滞后、信息化程度低等问题。旅游行政管理部门的管理方式相对落后,缺乏有效的信息化管理手段,信息沟通渠道不畅,这......
  • 基于Java实现的羽毛球馆管理系统设计与实现(源码+文档+部署讲解等)
    文章目录1.前言2.详细视频演示3.程序运行示例图4.文档参考5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue5.3程序操作流程6.选题推荐7.原创毕设案例8.系统测试8.1系统测试的目的8.2系统功能测试9.代码参考10.为什么选择我?11.获取源码1.前言......
  • Java反射
    Java反射引言在已知全类名的情况下,如果不通过new方法,如何创建一个对象并调用其方法?答:通过Java反射下面是实现的代码,仅展示一下反射用法,后面会讲如何使用配置参数class.path=com.shen.inspection.modules.reflection.DemoEntitymethod.name=hello需要创建实例的类......
  • JavaWeb:实验二JSP表单开发及访问数据库
    实现注册与登录功能:1.创建一个数据库,在数据库建立用户表。2.制作一个注册表单,可以输入账户和密码并提交(在数据提交之前用JS对表单数据进行有效性验证),将表单提交的数据写入数据库。3.制作一个登录表单,输入账号和密码,通过数据库进行验证,如果账号、密码验证通过,则显示“登录成功”......
  • JavaWeb:实验一JSP运行环境安装及配置
    **制作一个静态网站的基本页面index.html,要求如下:1.页面布局采用框架实现,页面布局及样式如图1所示。**2.在页面的A部分显示显示“登录”和“注册”链接。单击“登录”链接,在C部分显示登录页面,登录页面包含一个HTML表单,页面参考样式如图2所示;单击“注册”链接,在C部分显示注册页面......
  • 四,Java泛型、静态导入和可变参数
    Java泛型、静态导入和可变参数的详细指南在Java编程中,泛型、静态导入和可变参数是提高代码的重用性、类型安全和灵活性的重要特性。这些特性使得Java程序更加强大和易于维护。本文将详细介绍这些特性的使用方法和注意事项,并提供丰富的代码示例。泛型泛型是Java5引入的一项特性......
  • Javaee---多线程(一)
    文章目录1.线程的概念2.休眠里面的异常处理3.实现runnable接口4.匿名内部类子类创建线程5.匿名内部类接口创建线程6.基于lambda表达式进行线程创建7.关于Thread的其他的使用方法7.1线程的名字7.2设置为前台线程7.3判断线程是否存活8.创建线程方法总结9.start方法10.终......
  • Java消息队列入门详解
    什么是消息队列?消息队列的产生主要是为了解决系统间的异步解耦与确保最终一致性。在实际应用场景中,往往存在一些主流程操作和辅助流程操作,其中主流程需要快速响应用户请求,而辅助流程可能涉及复杂的处理逻辑或者依赖于外部服务。通过将这些辅助流程的消息放入消息队列,使得它们可......
  • 房产销售系统/房产销售/销售系统/房地产软件/房源管理/销售策略/客户管理/楼盘信息/房
    博主介绍......