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



  • 相关阅读:
    跨浏览器的事件处理程序
    jQuery提交Form
    js 多种变量定义(对象直接量,数组直接量和函数直接量)
    Asp.net Eval 截取字符串
    sql执行顺序
    IDEA File Templates模板
    Vim快捷键大全(转)
    Rider+Unity+XLua环境配置
    一定要进行代码复查
    如何在ubuntu上面安装luasocket
  • 原文地址:https://www.cnblogs.com/gmt-hao/p/14934878.html
Copyright © 2011-2022 走看看