Loading

平衡二叉搜索树及其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
posted @ 2020-03-25 10:45  文牧之  阅读(17)  评论(0)    收藏  举报  来源