"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)?