AVL树(Java实现)

Posted GoldArowana   &

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AVL树(Java实现)相关的知识,希望对你有一定的参考价值。

AVL树基本操作

未完....待续....

AVL树代码

public class AVLTree<Key extends Comparable<? super Key>, Value> {
    private class Node {
        Key key;//键,相当于词典里的单词
        Value value;//值,相当于词典里的单词解释
        int height;//结点的高度
        Node left;
        Node right;

        public Node(Key key, Value value) {
            this.key = key;
            this.value = value;
            this.left = null;
            this.right = null;
            int height = 0;
        }
    }

    private Node root;

    public AVLTree() {
        root = null;
    }

    private int height(Node node) {
        if (node != null) {
            return node.height;
        }
        return 0;
    }

    public int height() {
        return height(root);
    }

    private int max(int a, int b) {
        return a > b ? a : b;
    }

    private void preOrder(Node node) {
        if (node != null) {
            System.out.println(node.key);
            preOrder(node.left);
            preOrder(node.right);
        }
    }

    public void preOrder() {
        preOrder(root);
    }

    private void inOrder(Node node) {
        if (node != null) {
            inOrder(node.left);
            System.out.println(node.key);
            inOrder(node.right);
        }
    }

    public void inOrder() {
        inOrder(root);
    }

    public void postOrder(Node node) {
        if (node != null) {
            postOrder(node.left);
            postOrder(node.right);
            System.out.println(node.key);
        }
    }

    public void postOrder() {
        postOrder(root);
    }

    private Node search(Node node, Key key) {
        if (node == null) {
            return null;
        } else if (key.compareTo(node.key) == 0) {
            return node;
        } else if (key.compareTo(node.key) < 0) {
            return search(node.left, key);
        } else {//key.compareTo(node.key) > 0
            return search(node.right, key);
        }
    }

    public Node search(Key key) {
        return search(root, key);
    }

    private Node minNode(Node node) {
        if (node == null) {
            return null;
        } else if (node.left == null) {
            return node;
        } else {
            return minNode(node.left);
        }
    }

    public Node minNode() {
        return minNode(root);
    }

    private Node maxNode(Node node) {
        if (node == null) {
            return null;
        } else if (node.right == null) {
            return node;
        } else {
            return maxNode(node.right);
        }
    }

    public Node maxNode() {
        return maxNode(root);
    }

    // 对如下的LL情况
    //
    //         k1                 k2
    //        /  \               /      //       k2   z    LL转     x    k1
    //      /  \       ----\   /    /     //     x    y      ----/  o    y   z
    //    /
    //   o
    //
    //   或
    //
    //         k1                 k2
    //        /  \               /      //       k2   z    LL转     x    k1
    //      /  \       ----\     \   /     //     x    y      ----/      o y   z
    //          //       o
    //
    private Node leftLeftRotation(Node k1) {
        Node k2 = k1.left; //k2是k1的左子树

        k1.left = k2.right;//k2的右子树 变为 k1 的左子树
        k2.right = k1; //k1变为k2的右子树

        k1.height = max(height(k1.left), height(k1.right)) + 1;//计算k1的高度
        k2.height = max(height(k2.left), k1.height) + 1;//计算k2的高度

        return k2;//返回新的根k2
    }


    // 对如下的RR情况
    //
    //         k1                      k2
    //        /  \                    /      //       x    k2      RR转       k1   k3
    //           / \      ----\     / \        //          y   k3    ----/    x   y    z
    //                   //                z
    //
    //   或
    //
    //         k1                      k2
    //        /  \                    /      //       x    k2      RR转       k1   k3
    //           / \      ----\     / \   /
    //          y  k3     ----/    x   y z
    //             /
    //            z
    //
    public Node rightRightRotation(Node k1) {
        Node k2 = k1.right;

        k1.right = k2.left;
        k2.left = k1;

        k1.height = max(height(k1.left), height(k1.right)) + 1;
        k2.height = max(k1.height, height(k2.right)) + 1;

        return k2;
    }

    // 对如下的LR情况
    //      k1                k1                k3
    //     /  \              /  \              /      //    k2   z  k2左旋    k3   z   k1右旋    k2  k1
    //   /  \     -----\   / \      -----\   / \  /     //  w   k3    -----/  k2  y     -----/  w  x y   z
    //     /  \   RR单转  / \        LL单转
    //    x    y         w  x
    //
    public Node leftRightRotation(Node k1) {
        k1.left = rightRightRotation(k1.left);
        return leftLeftRotation(k1);
    }

    // 对如下的RL情况
    //    k1                k1                  k3
    //   /  \     k2右旋    / \      k1左旋     /      //  w   k2    -----\   w  k3    -----\    k1  k2
    //      / \   -----/     / \    -----/   / \  /     //     k3  z  LL单转     x  k2   RR单旋  w   x y  z
    //    / \                  /     //   x   y                y   z
    //
    public Node rightLeftRotation(Node k1) {
        k1.right = leftLeftRotation(k1.right);
        return rightRightRotation(k1);
    }

    
    //插入
    
    //删除
}

  

以上是关于AVL树(Java实现)的主要内容,如果未能解决你的问题,请参考以下文章

AVL树的Java实现

自己动手实现java数据结构 AVL树

平衡二叉树 AVL树结构详解 [Java实现]--源码部分

JAVA数据结构--AVL树的实现

深度解析AVL树

java项目---用java实现二叉平衡树(AVL树)并打印结果(详)