二叉树排序树的操作
二叉树又称排序树,是一种对数据操作达到logn的数量级的结构。
在理想情况下每种操作可以达到这种效果。但是在现实中往往做不到这样。尤其是当数据有序插入或者数据量的分化程度大时复杂度会大大增加。
这时候出现了平衡二叉树。作用是使二叉树的形状接近于矮胖。这样对树的各种操作就可以达到logn。
二叉树的基本操作不再赘述。主要讲一下怎么在操作完一次后完成树的平衡。
以插入为例,当插入一个结点之后。自此节点的插入结点向上遍历,发现不平衡结点就对于不平衡结点旋转至平衡。直到遍历到根节点。
四种不平衡的四种旋转。
- 在失衡结点的左孩子的左子树上插入 - - -LL右旋
- 在失衡结点的左孩子的右子树上插入 - - -RL旋转
- 在失衡结点的右孩子的左子树上插入 - - -LR右旋
- 在失衡结点的右孩子的右子树上插入 - - -RR右旋
因为这里情况有些复杂,建议读者在纸上画画进行条件判断来确定是哪种旋转。
另一种思路是每次插入都是递归插入,每次更新高度差。如果有不平衡就进行旋转。无论是插入删除还是更新都是在递归的过程中平衡整棵树。代码会大大减少
代码如下
public class Demo05{
public static void main(String[] args) {
AVLNode root = null;
for(int i = 1; i <= 10; i++){
root = insert(root, i);
}
insert(root, 2);
inOrder(root);
System.out.println();
// System.out.println("height: " + (root.height + 1) + " " + (int)Math.ceil(Math.log(10)/ Math.log(2))); // 树的高度为叶子节点的最大深度加上1(根节点为第一层)
remove(root, 4);
inOrder(root);
}
public static AVLNode insert(AVLNode root, int data) {
if (root == null) {
root = new AVLNode(data);
return root;
}
if (data <= root