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只会传入值,无法传入地址)记录是否有节点破坏规则。



  • 相关阅读:
    [CF895C]Square Subsets
    Brainf**k(一位数求max)
    [CF1019A]Elections
    [LOJ #2538][PKUWC 2018]Slay the Spire
    [CF911F]Tree Destruction
    [bzoj4832][Lydsy1704月赛]抵制克苏恩
    [洛谷P1420]最长连号
    [bzoj4872][Shoi2017]分手是祝愿
    [洛谷P1887]乘积最大3
    [洛谷P3743]kotori的设备
  • 原文地址:https://www.cnblogs.com/gmt-hao/p/14934878.html
Copyright © 2011-2022 走看看