平衡二叉搜索树及其java实现
一.什么是平衡二叉搜索树?
在二叉搜索树的基础上:
每个左右子树的高度差为0,此时的二叉树称为完全平衡二叉搜索树。
每个左右子树的高度差不大于1时,此时的二叉树称为AVL树。(就是平衡二叉搜索树)
二.旋转
当树的结构发生变化时(插入,删除节点),它可能变得不符合AVL结构了,所以我们需要旋转来保证树符合AVL结构。
其中心思想是:将从插入点到根节点路径上第一个不满足AVL性质的节点修复。
以插入为例,存在四种情况:
1.在节点的左孩子的左子树插入元素。
例如:我们在9的左孩子的左子树插入7
我们的解决方案是:
1.将9变成8的右子树
2.将8的位置移到9的位置(我个人理解为7,8,9整体向右旋转)
结果图为:
具体实现代码为:
// 1.左左插入 左向右旋转 这是第一步 ,第二步是利用返回的节点进行相关操作即可
AVLTreeNode SingleRotataLeft(AVLTreeNode X)//X节点为9
{
AVLTreeNode W=X.getLeft();
X.setLeft(W.getRight());
W.setRight(X);
X.setHeight(Math.max(Height(X.getLeft()),Height(X.getRight()))+1);
W.setHeight(Math.max(Height(W.getLeft()),X.getHeight())+1);
return W;
}
2.在节点的右孩子的右子树插入元素。
例如:我们在12的右子树插入20
我们的解决方案是:
1.将10变成12的左子树
2.将12的位置移到10的位置(我个人理解为10,12,20整体向右旋转)
结果图为:
代码如下:
//2. 右右插入 右向左旋转 //这也只是第一步
AVLTreeNode SingleRotataRight(AVLTreeNode X)//X为10
{
AVLTreeNode W=X.getRight();
X.setRight(W.getLeft());
W.setLeft(X);
X.setHeight(Math.max(Height(X.getRight()),Height(X.getLeft()))+1);
W.setHeight(Math.max(Height(W.getRight