- 二叉搜索树判断是否平衡有两种方法
- 自顶向下, 比较容易,由上到下遍历每个元素,判断左子树和右子树的高度, 大于1就不平衡, 多次判断节点高度, 复杂度为O(n²)
- 自下向上, 其实就是后续遍历判断树的高度, 其中-1代表不平衡, 那么代码的主要逻辑就是
左子树不平衡 或者 右子树不平衡 或者 左子树和右子树高度大于1(也就是自己不平衡), 那么返回-1 . 否则返回树的高度即可
package com.zzk.data;
/**
* @author zzk
* @Title: CheckAVL
* @Description: 判断 "二叉搜索树" 是否平衡
* @date 2021-11-15 10:41
*/
public class CheckAVL<T extends Comparable> {
CheckAVL.Node root;
public CheckAVL() {
this.root = null;
}
static class Node<T extends Comparable> {
public T key;
public CheckAVL.Node<T> left;
public CheckAVL.Node<T> right;
public CheckAVL.Node<T> parent;
public Node(T key, CheckAVL.Node left, CheckAVL.Node right, CheckAVL.Node parent) {
this.key = key;
this.left = left;
this.right = right;
this.parent = parent;
}
@Override
public String toString() {
return "Node{" +
"key=" + key +
'}';
}
}
/**
* 插入到树中
*/
public void insert(T key) {
if (null == root) {
root = new CheckAVL.Node(key, null, null, null);
} else {
insert(root, key);
}
}
private void insert(CheckAVL.Node node, T key) {
CheckAVL.Node<T> targetNode = new CheckAVL.Node<>(key, null, null, node);
if (key.compareTo(node.key) < 0) {
if (null == node.left) {
node.left = targetNode;
} else {
insert(node.left, key);
}
} else {
if (null == node.right) {
node.right = targetNode;
} else {
insert(node.right, key);
}
}
}
public boolean isBalance(){
return height(root) >= 0;
}
private int height(CheckAVL.Node node){
if (null == node) {
return 0;
}
int leftHeight = height(node.left);
int rightHeight = height(node.right);
//左树不平衡 或者 右树不平衡, 或者高度大于1 导致的不平衡
if (leftHeight == -1 || rightHeight == -1 || Math.abs(leftHeight - rightHeight) > 1) {
return -1;
}else{
return Math.max(leftHeight,rightHeight) + 1;
}
}
public static void main(String[] args) {
int[] intArr1 = {3,9,20,15,7};
int[] intArr2 = {1,2,2,3,3,4,4};
CheckAVL<Integer> integerCheckAVL1 = new CheckAVL<>();
CheckAVL<Integer> integerCheckAVL2 = new CheckAVL<>();
for (int i : intArr1) {
integerCheckAVL1.insert(i);
}
for (int i : intArr2) {
integerCheckAVL2.insert(i);
}
System.out.println(integerCheckAVL1.isBalance());
System.out.println(integerCheckAVL2.isBalance());
}
}