zoukankan      html  css  js  c++  java
  • "Coding Interview Guide" -- 判断二叉树是否为平衡二叉树

    题目

      平衡二叉树的性质为:要么是一棵空树,要么任何一个节点的左右子树高度差的绝对值不超过1。给定一棵二叉树的头节点head,判断这棵二叉树是否为平衡二叉树

    要求

      如果二叉树的节点数为N,要求时间复杂度为O(N)

    分析

      平衡二叉树要么是一棵空树,要么任何一个节点的左右子树高度差的绝对值不超过1。平衡二叉树的任一子树也是平衡二叉树,所以如果二叉树的某一节点的左右子树高度差的绝对值超过了1,则该二叉树必定不是平衡二叉树。所以在递归求树高的过程中,计算当前节点的左右子树高度差的绝对值是不是超过了1,如果没有超过,则表明以当前节点为头节点的子树是平衡二叉树,需继续判断其它子树是否为平衡二叉树;如果超过了,说明该二叉树一定不是平衡二叉树,此时不用再继续判断其它子树。

     1 public boolean isBalanceTree(Node head)
     2 {
     3     if(head == null)             // 平衡二叉树可以是空树
     4     {
     5       return true;
     6     }
     7 
     8     boolean[] res = new boolean[1];      // res记录是否为平衡二叉树
     9     res[0] = true;
    10     getHeight(head, 1, res);
    11     return res[0];
    12 }
    13 
    14 public int getHeight(Node head, int level, boolean[] res)
    15 {
    16     if(head == null)
    17     {
    18       return level;
    19     }
    20 
    21     int l = getHeight(head.left, level+1, res);
    22     if(!res[0])             // 只要任一子树不是平衡二叉树,则整个二叉树就不是平衡二叉树,直接返回
    23     {
    24       return level;     
    25     }
    26     int r = getHeight(head.right, level+1, res);
    27     if(!res[0])
    28     {
    29       return level;
    30     }
    31     if(Math.abs(l - r) > 1)         // 高度差的绝对值超过1,不是平衡二叉树
    32     {
    33       res[0] = false;
    34     }
    35 
    36     return Math.max(l, r);
    37 }

    来源:左程云老师《程序员代码面试指南》

  • 相关阅读:
    vue使用腾讯地图选点组件问题总结
    腾讯位置服务实现点击建筑显示围栏及建筑信息效果
    unity使用UMP播放RTSP流,打包exe后显示空白
    uniapp获取context
    Android studio安装debug apk提示“调用者不被允许测试的测试程序”
    unity使用VuplexWebView内嵌浏览器遮挡前方按钮的问题
    unity透明材质上放3dtext不同角度,文字变灰的问题
    Python线程指南
    mysql 简单表和索引
    dubbo 提示 403 unknown user
  • 原文地址:https://www.cnblogs.com/OoycyoO/p/10885369.html
Copyright © 2011-2022 走看看