算法笔记-判断是否平衡二叉树

  平衡二叉树的定义:平衡树(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只会传入值,无法传入地址)记录是否有节点破坏规则。



原文地址:https://www.cnblogs.com/gmt-hao/p/14934878.html