zoukankan      html  css  js  c++  java
  • 算法笔记-判断是否平衡二叉树

      平衡二叉树的定义:平衡树(Balance Tree,BT) 指的是,任意节点的子树的高度差都小于等于1,我们可以看下图:左边就不是平衡二叉树,因为3的高度为3而5的高度为1,相差大于1。看右边树最大差别3的高度为2,5的高度为1,最大只相差1,所以为平衡二叉树。

     那么我们怎么实现呢? 最简单的做法就是分两步:1.计算每个节点的高度 2.遍历查看每个节点的子节点高度相差是否大于1,伪代码实现

            forEach(node){
                node.height = getHeight(node);
            }
    
    
            forEach(node){
                if(Math.abs(node.right.height - node.left.height) > 1){
                    return false;
                }
                return true;
            }

     但是其实我们可以在遍历每个节点时逐级递增记录树的高度,到底返回,这样复杂度可以保持在O(n),看代码实现:

    public static boolean isbalance(Node node){
            boolean[] isb = new boolean[1];
            isb[0] = true;
            getHeight(node,1,isb);
            return isb[0];
        }
    private static int getHeight(Node node, int level, boolean[] isb) {
            if(node == null){
                return level;
            }
    
            int hl = getHeight(node.left, level + 1, isb);
            if(isb[0] == false){
                return 0;
            }
    
            int hr = getHeight(node.right, level + 1, isb);
            if(isb[0] == false){
                return 0;
            }
    
            if(Math.abs(hr - hl) >1){
                isb[0] = false;
            }
    
            return Math.max(hl,hr);
        }

    这里使用了一个level传入当前节点高度,用来计算出子节点的高度,还使用了一个布尔数组(直接传boolean只会传入值,无法传入地址)记录是否有节点破坏规则。



  • 相关阅读:
    计算几何 val.3
    项目中常用的19条MySQL优化
    九年测试老鸟给测试新人的6条忠告
    敏捷软件测试常见的七个误区
    JEMTER简单的测试计划
    你真的会搭建测试环境吗?
    使用 Fiddler工具模拟post四种请求数据
    性能测试方案及性能测试流程
    Appium的环境搭建和配置
    Python :编写条件分支代码的技巧
  • 原文地址:https://www.cnblogs.com/gmt-hao/p/14934878.html
Copyright © 2011-2022 走看看