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

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

猜你喜欢

转载自www.cnblogs.com/latup/p/10885369.html