• 二叉树——判断一棵树是否是平衡二叉树


    平衡二叉树 (空树或者左右两个孩子高度差不超过1)

    在涉及到二叉树的题目时,递归函数非常好用

    列出可能性-》整理出返回值的类型-》整个递归过程按照同样的结构得到子树的信息,整合子树的信息,加工出应该返回的信息,向上返回

    1.左子树是否平衡

    2.右子树是否平衡

    3.左子树的高度

    4.右子树的高度

    根据可能性,使用递归函数

    可能性-》返回值的类型  

    //列出可能性  左右子树是否分别平衡,若平衡后,左右子树的高度
        public static class ReturnData{
            boolean isB;
            int high;
    
            public ReturnData(boolean isB, int high){
                this.isB = isB;
                this.high = high;
            }
        }
    

      

    整个递归过程按照同样的结构得到子树的信息(左子树和右子树分别是否平衡,以及它们的高度),整合子树的信息(左右子树的高度差是否符合要求),加工出返回的信息(应该返回左右子树中,高度较大的那一个high+1

    public static ReturnData process(Tree tree){
            if(tree == null) return new ReturnData(true, 0);
    
    
            ReturnData leftData = process(tree.left);
            if(!leftData.isB){
                return new ReturnData(false, 0);
            }
    
            ReturnData rightData = process(tree.right);
            if(!rightData.isB){
                return new ReturnData(false, 0);
            }
    
            if(Math.abs(leftData.high - rightData.high) > 1){
                return new ReturnData(false, 0);
            }
    
            return new ReturnData(true, Math.max(leftData.high, rightData.high) + 1);
        }
    

      

    整体的代码

    public class IsBanlancedTree {
    
        //列出可能性  左右子树是否分别平衡,若平衡后,左右子树的高度
        public static class ReturnData{
            boolean isB;
            int high;
    
            public ReturnData(boolean isB, int high){
                this.isB = isB;
                this.high = high;
            }
        }
    
    
        public static ReturnData process(Tree tree){
            if(tree == null) return new ReturnData(true, 0);
    
    
            ReturnData leftData = process(tree.left);
            if(!leftData.isB){
                return new ReturnData(false, 0);
            }
    
            ReturnData rightData = process(tree.right);
            if(!rightData.isB){
                return new ReturnData(false, 0);
            }
    
            if(Math.abs(leftData.high - rightData.high) > 1){
                return new ReturnData(false, 0);
            }
    
            return new ReturnData(true, Math.max(leftData.high, rightData.high) + 1);
        }
    
        public static boolean isBanlancedTree(Tree tree){
            return process(tree).isB;
        }
    }
    

      

      

  • 相关阅读:
    TestNG(五) 5-7 套件测试
    TestNG(四) 基本注解BeforeSuite和AfterSuite
    【ES6】知识点汇总--1>10
    【vue】移动端项目初始化问题汇总
    【vue】单页面应用和多页面应用
    【Vue】单文件组件和路由
    【Vue】项目代码结构介绍
    【Docker】Centos7下Docker安装及Python环境配置
    Django面试题汇总
    vue面试题汇总
  • 原文地址:https://www.cnblogs.com/SkyeAngel/p/8947290.html
Copyright © 2020-2023  润新知