算法笔记-判断是否平衡二叉树
平衡二叉树的定义:平衡树(Balance Tree,BT) 指的是,任意节点的子树的高度差都小于等于1,我们可以看下图:左边就不是平衡二叉树,因为3的高度为3而5的高度为1,相差大于1。看右边树最大差别3的高度为2,5的高度为1,最大只相差1,所以为平衡二叉树。
那么我们怎么实现呢? 最简单的做法就是分两步:1.计算每个节点的高度 2.遍历查看每个节点的子节点高度相差是否大于1,伪代码实现
forEach(node){
node.height = getHeight(node);
}
forEach(node){
if(Math.abs(node.right.height - node.left.height) > 1){
return false;
}
return true;
}
但是其实我们可以在遍历每个节点时逐级递增记录树的高度,到底返回,这样复杂度可以保持在O(n),看代码实现:
public static boolean isbalance(Node node){ boolean[] isb = new boolean[1]; isb[0] = true; getHeight(node,1,isb); return isb[0]; }
private static int getHeight(Node node, int level, boolean[] isb) { if(node == null){ return level; } int hl = getHeight(node.left, level + 1, isb); if(isb[0] == false){ return 0; } int hr = getHeight(node.right, level + 1, isb); if(isb[0] == false){ return 0; } if(Math.abs(hr - hl) >1){ isb[0] = false; } return Math.max(hl,hr); }
这里使用了一个level传入当前节点高度,用来计算出子节点的高度,还使用了一个布尔数组(直接传boolean只会传入值,无法传入地址)记录是否有节点破坏规则。