zoukankan      html  css  js  c++  java
  • 数据结构——平衡二叉树

    特征

    1、空树是平衡二叉树。
    2、如果一棵树不为空,并且其中所有的子树都满足各自的左子树与右子树的高度差都不超过 1。

    下面介绍一个简单应用,平衡二叉树的相关操作以后补充。

    判断一棵二叉树是否为平衡二叉树

    给定一颗二叉树的头结点 head,判断一棵树是否是平衡二叉树。

    1.1、左子树是否为平衡二叉树
    1.2、记录左子树的深度,最深到达哪一层,记为 LH
    2.1、右子树是否为平衡二叉树
    2.2、记录右子树的深度,最深到达哪一层,记为 RH
    3、如果左子树或右子树有一个不是平衡二叉树,则整棵树就不是平衡二叉树
    4、如果左、右子树都是平衡二叉树,那么再比较两者深度的差值,如果大于 1,那么就不是平衡二叉树,否则就是平衡二叉树。

    public boolean check(TreeNode root) {
        boolean[] res = new boolean[1];
        res[0] = true;
        int level = 0;
        getHeight(root, level, res);// 获得以根结点为头的深度
        return res[0];
    }
    
    private int getHeight(TreeNode head, int level, boolean[] res) {
        if (head == null) return level; // 如果当前 head 为空,则返回当前所到达的深度
        int LH = getHeight(head.left, level+1, res); // 获得以当前 head 为头的左子树深度
        if (!res[0]) return level; // 如果以当前 head 为头的左子树不是 AVL,直接返回当前所到达的深度
        int RH = getHeight(head.right, level+1, res); // 获得以当前 head 为头的右子树深度
        if (!res[0]) return level; // 如果以当前 head 为头的右子树不是 AVL,直接返回当前所达到的深度
        if (Math.abs(LH - RH) > 1) res[0] = false; // 比较以当前 head 为头的左子树深度和右子树深度,如果其相差大于 1,则说明以当前 head 为头的二叉树不是 AVL
        return Math.max(LH, RH); // 最后返回当前以 head 为头的深度
    }
  • 相关阅读:
    (8) MySQL主从复制架构使用方法
    (7) MySQL数据库备份详解
    (6) MySQL慢查询日志的使用
    解决通过Nginx转发的服务请求头header中含有下划线的key,其值取不到的问题
    (5) 电商场景下的常见业务SQL处理
    (4) MySQL中EXPLAIN执行计划分析
    (3) MySQL分区表使用方法
    (2) 电商数据库表设计
    (1) Mysql高性能优化规范建议
    linux每日命令(39):lsof命令
  • 原文地址:https://www.cnblogs.com/zhengbin/p/6582413.html
Copyright © 2011-2022 走看看