AVL树-JAVA-图示/代码

来源:互联网 发布:明通网络数码科技 编辑:程序博客网 时间:2024/05/01 05:47

AVL树-JAVA-图示/代码

图片转自:http://blog.csdn.net/collonn/article/details/20128205
这里写图片描述

ADT:

public interface AVLTree {boolean insert(Node node, int value);boolean delete(int value);Node find(int value);boolean isBalanced(Node node);boolean singleRotateToLeft(Node node);boolean singleRotateToRight(Node node);boolean doubleRotateToLR(Node node);boolean doubleRotateToRL(Node node);int height(Node node);void LDR(Node node);}

实现代码:

public class AVLTreeImpl implements AVLTree {private Node root;public Node getRoot() {    return root;}public void setRoot(Node root) {    this.root = root;}@Overridepublic boolean insert(Node node, int value) {    // TODO Auto-generated method stub    //如果root为null,将值赋给root后结束    if (root == null) {        root = new Node(value, null, null);        return true;    }    //如果node参数为null的话,将根root赋给node后继续    if (node == null) {        node = root;    }    if (value < node.getValue()) {        if (node.getLeft() == null) {            node.setLeft(new Node(value, null, null));        } else {            insert(node.getLeft(), value);        }        //插入后发现树不平衡,平衡一下        if (!isBalanced(node)) {            if (value < node.getLeft().getValue()) {                singleRotateToRight(node);            } else {                doubleRotateToLR(node);            }        }    } else {        if (node.getRight() == null) {            node.setRight(new Node(value, null, null));        } else {            insert(node.getRight(), value);        }        //插入后发现树不平衡,平衡一下        if (!isBalanced(node)) {            if (value < node.getLeft().getValue()) {                doubleRotateToRL(node);            } else {                singleRotateToLeft(node);            }        }    }    return true;}@Overridepublic boolean delete(int value) {    // TODO Auto-generated method stub    return false;}@Overridepublic Node find(int value) {    // TODO Auto-generated method stub    return null;}//单步向右转@Overridepublic boolean singleRotateToLeft(Node node) {    // TODO Auto-generated method stub    if (node == null || node.getRight() == null)        return false;    Node recordRoot = node;    Node recordRight = node.getRight();    if (recordRight.getLeft() != null) {        recordRoot.setRight(recordRight.getLeft());    }    recordRight.setLeft(recordRoot);    return true;}//单步向左转@Overridepublic boolean singleRotateToRight(Node node) {    // TODO Auto-generated method stub    if (node == null || node.getLeft() == null)        return false;    Node recordRoot = node;    Node recordLeft = node.getLeft();    if (recordLeft.getRight() != null) {        recordRoot.setLeft(recordLeft.getRight());    }    recordLeft.setRight(recordRoot);    return true;}//双步旋转先左后右@Overridepublic boolean doubleRotateToLR(Node node) {    // TODO Auto-generated method stub    if (!singleRotateToLeft(node.getLeft())) {        return false;    }    if (!singleRotateToRight(node)) {        return false;    }    return true;}//双步旋转先右后左@Overridepublic boolean doubleRotateToRL(Node node) {    // TODO Auto-generated method stub    if (!singleRotateToRight(node.getRight())) {        return false;    }    if (!singleRotateToLeft(node)) {        return false;    }    return true;}//求节点的高度@Overridepublic int height(Node node) {    // TODO Auto-generated method stub    if (node == null)        return 0;    int heightL = height(node.getLeft());    int heightR = height(node.getRight());    return heightL <= heightR ? heightR : heightL;}//中序遍历@Overridepublic void LDR(Node node) {    // TODO Auto-generated method stub        if(node == null) return;        LDR(node.getLeft());        System.out.println("value:" + node.getValue() + ", left:" + node.getLeft() + ", right:" + node.getRight());        LDR(node.getRight());}//平衡判断@Overridepublic boolean isBalanced(Node node) {    // TODO Auto-generated method stub    if (Math.abs(height(node.getLeft()) - height(node.getRight())) > 1) {        return false;    }    return true;}@Overridepublic String toString() {    // TODO Auto-generated method stub    return root.toString();}}

测试代码:

public static void main(String[] args) {    AVLTreeImpl avl = new AVLTreeImpl();    avl.insert(null, 5);    avl.insert(null, 4);    avl.insert(null, 3);    avl.insert(null, 2);    avl.insert(null, 1);    avl.insert(null, 8);    avl.LDR(avl.getRoot()); //中序遍历}

结果:

value:1, left:null, right:null
value:2, left:1, right:null
value:3, left:2, right:null
value:4, left:3, right:null
value:5, left:4, right:8
value:8, left:null, right:null

delete

你可能注意到上面没有写delete方法,因为delete方法与比insert方法还要复杂。

删除节点的处理:
删除节点的三种情况:
1)删除节点无左节点,也无右节点:
直接删除,之后向上递归平衡。
2)删除节点只有一个节点:
直接删除后接上子节点,之后向上递归平衡。
3)删除节点有两个节点:
将左子树最大值与删除节点交换。删除交换后的节点,之后向上递归平衡。

失衡情况下的平衡处理:
1)失衡结点 的右子树的平衡因子为-1
这里写图片描述

2)失衡结点的右子树的平衡因子为0
这里写图片描述

3)失衡结点的右子树的平衡因子为1
这里写图片描述

delete代码

代码太多,写乱了。

0 0
原创粉丝点击