• "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 }

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

  • 相关阅读:
    死循环(endless loop)
    while循环和do-while循环语句
    99乘法表(for循环嵌套)
    代码块和作用域
    Break语句和Continue语句
    习题两则的简化(利用for循环)
    for循环语句
    条件判断语句(if-else)
    习题两则(自增操作符和数据类型相关知识点)
    字符集、编码和字符串
  • 原文地址:https://www.cnblogs.com/OoycyoO/p/10885369.html
Copyright © 2020-2023  润新知