看了很多博客,都是解答,怎么去判断一棵树为高度平衡的二叉树,所以这里就出一个,判断是否为平衡二叉树
也就是AVL树
特点是,左节点全部小于当前节点,右节点全部大于当前节点,并且没有重复值,其实就是二叉查找树
平衡二叉树与二叉查找树不同的是,平衡二叉树深度差不能大于1,如下图(画的不好见谅)
static Integer maxHigh = null; //全局变量存储最大深度
static Integer minHigh = null; //全局变量存储最小深度
public static boolean isBalanceBST(TreeNode root) {
maxHigh = null;
minHigh = null;
return isBalanceBST(root,null,null,0);
}
// high: 当前节点深度
//lower和upper: 二叉查找树中使用的参数,用于判断该树是否为二叉查找树,详情去看其他博客,这个比较多
public static boolean isBalanceBST(TreeNode root,Integer lower,Integer upper,int high) {
if(root==null){
// 整体思路:判断maxHigh和minHigh的高度差,大于1表示非平衡二叉树
if(maxHigh==null&&minHigh==null){ //两个高度阈都为空,表示第一次遍历到子节点
maxHigh = high;
}else if(maxHigh!=null){ //不是第一次遍历到子节点
if(minHigh==null){ //第二次遍历到子节点
int max = Math.max(maxHigh,high);
minHigh = Math.max(maxHigh,high);
maxHigh = max;
}else if(minHigh!=null){ //第二次以上遍历到子节点
//高的赋值给 max ,低的赋值给min
minHigh = Math.min(high,minHigh);
maxHigh = Math.max(high,maxHigh);
}
if(Math.abs(maxHigh-minHigh)>1){ //高度差,如果大于1,则不是平衡二叉树
return false;
}
}
}else{
high++;
// 以下为判断是否为二叉查找树
int val = root.val;
if(lower!=null&&val>=lower){return false;}
if(upper!=null&&val<=upper){return false;}
if(!isBalanceBST(root.left,val,upper,high)){return false;}
if(!isBalanceBST(root.right,lower,val,high)){return false;}
}
return true;
}
代码的时间复杂度为 O(n) ,但是其实是有些冗余的,对于这个深度判断,应该还可以更简化一些,坐等大佬来指教