"Coding Interview Guide" -- 判断二叉树是否为平衡二叉树

Posted latup

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了"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 }

 

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

 

以上是关于"Coding Interview Guide" -- 判断二叉树是否为平衡二叉树的主要内容,如果未能解决你的问题,请参考以下文章

"Coding Interview Guide" -- 仅用递归函数和栈操作逆序一个栈

"Coding Interview Guide" -- 判断二叉树是否为平衡二叉树

"Coding Interview Guide" -- 只用位运算不用算术运算实现整数的加减乘除运算

为啥这个例子的时间复杂度来自“Cracking the Coding Interview” O(k c^k)?

[Cracking the Coding Interview] 4.4 Check Balanced

Cracking the coding interview 智力题之-扔鸡蛋问题