满二叉树一定是一颗平衡二叉树
平衡二叉树:对于任意一个节点,左子树和右子树的高度差不能超过1
平衡二叉树的高度和节点数量之间的关系也是O(logn)的
节点的高度等于左右子树中最高的节点的高度 加一
平衡因子:左右子树的高度差(较大的减较小的)或者左右 子树高度差的绝对值
如果平衡因子大于1,则不是一棵平衡二叉树,不大于1则是一颗平衡二叉树
我们在原来的二分搜索树的基础上加上height,获得这个节点的高度就好了,我们要判断下这个节点是否存在,存在返回节点的高度,不存在直接返回0,。添加操作时对左右节点的高度值进行维护让左右子树高度值最大值 +1 ;具体的实现代码如下:
private class Node{
public K key;
public V value;
public Node left,right;
private int height;
public Node(K key,V value) {
this.key = key;
this.value = value;
left = null;
right = null;
height = 1;
}
}
private Node root;
private int size;
public AVLTree() {
root = null;
size = 0;
}
public int getSize() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
//获得节点node的高度
private int getHeight(Node node) {
if(node == null) {
return 0;
}
return node.height;
}
//获得节点node的平衡因子
private int getBalanceFactor(Node node) {
if(node == null) {
return 0;
}
return getHeight(node.left) - getHeight(node.right);
}
//向二分搜索树种添加新的元素(key,value)
public void add(K key,V value) {
root = add(root,key,value);
}
//向以node为根的二分搜索树中插入元素(key,value),递归算法
//返回插入新节点后二分搜索树的根
private Node add(Node node, K key,V value) {
if(node == null) {
size++;
return new Node(key,value);
}
if(key.compareTo(node.key) < 0) {
node.left = add(node.left,key,value);
}else if(key.compareTo(node.key) > 0) {
node.right = add(node.right,key,value);
}else {
node.value = value;
}
//更新height
node.height = 1 + Math.max(getHeight(node.left), getHeight(node.right));
//计算平衡因子
int balan