Java实现Avl树

Avl树即左右子树的深度【高度】相差不可超过1,所以在插入key的时候,就会出现需要旋转【更改根节点】的操作

下面是源代码:

/*
the define of avltree's node
 */
class MyNode {
    int key, height;
    MyNode left, right;

    MyNode(int d) {
        key = d;
        height = 1;
    }
}

public class MyAvlTree {
    MyNode root;

    /*
    the function of get_tree_height
     */
    int getHeight(MyNode node) {
        if (node == null)
            return 0;
        return node.height;
    }

    /*
    the function of get the max of two numbers
     */
    int max(int a, int b) {
        return (a > b) ? a : b;
    }

    /*
    the function of right rotate subtree rooted y
     */
    MyNode rightRoate(MyNode y) {
        MyNode x = y.left;
        MyNode t = x.right;

        /*
        perform rotation
         */
        x.right = y;
        y.left = t;

        /*
        update the heights
         */
        y.height = max(getHeight(y.left), getHeight(y.right)) + 1;
        x.height = max(getHeight(x.left), getHeight(x.right)) + 1;
        // return new root
        return x;
    }

    /*
    the function of left rotate subtree rooted x
     */
    MyNode leftRoate(MyNode x) {
        MyNode y = x.right;
        MyNode t = y.left;

        /*
        perform rotation
         */
        y.left = x;
        x.right = t;

       /*
       update the heights
        */
        x.height = max(getHeight(x.left), getHeight(x.right));
        y.height = max(getHeight(y.left), getHeight(y.right));
        //return new root
        return x;
    }

    /*
    get balance factor of node n
     */
    int getBalance(MyNode node) {
        if (node == null)
            return 0;
        return getHeight(node.left) - getHeight(node.right);
    }

    /*
    the function of insert
     */
    MyNode insertKey(MyNode n, int key) {
        if (n == null)
            return (new MyNode(key));
        if (key > n.key)
            n.right = insertKey(n.right, key);
        else if (key < n.key)
            n.left = insertKey(n.left, key);
        else
            return n;

        /*
        update height
         */
        n.height = 1 + max(getHeight(n.left), getHeight(n.right));

        //get balance
        int balance = getBalance(n);

        /*
        there are four cases
         */
        //left-left case
        if (balance > 1 && key < n.left.key)
            return rightRoate(n);
        //right-right case
        if (balance > 1 && key > n.right.key)
            return leftRoate(n);
        //left-right case
        if (balance > 1 && key > n.left.key) {
            n.left = leftRoate(n.left);
            return rightRoate(n);
        }
        //right-left case
        if (balance > 1 && key < n.right.key) {
            n.right = rightRoate(n.right);
            return leftRoate(n);
        }
        return n;
    }

    /*
    the functionn of preOrder
     */
    void preOrder(MyNode node) {
        if (node != null) {
            System.out.print(node.key + " ");
            preOrder(node.left);
            preOrder(node.right);
        }
    }

    /*
    the test example
     */
    public static void main(String[] args) {
        MyAvlTree tree = new MyAvlTree();

        //the test
        tree.root = tree.insertKey(tree.root, 10);
        tree.root = tree.insertKey(tree.root, 20);
        tree.root = tree.insertKey(tree.root, 30);
        tree.root = tree.insertKey(tree.root, 40);
        tree.root = tree.insertKey(tree.root, 50);
        tree.root = tree.insertKey(tree.root, 25);

        System.out.println("Preorder traversal" +
                " of constructed tree is : ");
        tree.preOrder(tree.root);
    }
}

 

转载于:https://www.cnblogs.com/xuxiaojin/p/9781771.html

AVL树是一种自平衡的二叉搜索树,它的升序遍历可以通过中序遍历来实现。下面是Java实现AVL树升序遍历的示例代码: ```java // AVL树节点定义 class Node { int key; int height; Node left; Node right; Node(int key) { this.key = key; this.height = 1; } } // AVL树类定义 class AVLTree { Node root; // 获取节点的高度 int getHeight(Node node) { if (node == null) { return 0; } return node.height; } // 更新节点的高度 void updateHeight(Node node) { node.height = Math.max(getHeight(node.left), getHeight(node.right)) + 1; } // 获取节点的平衡因子 int getBalanceFactor(Node node) { if (node == null) { return 0; } return getHeight(node.left) - getHeight(node.right); } // 右旋操作 Node rotateRight(Node y) { Node x = y.left; Node T2 = x.right; x.right = y; y.left = T2; updateHeight(y); updateHeight(x); return x; } // 左旋操作 Node rotateLeft(Node x) { Node y = x.right; Node T2 = y.left; y.left = x; x.right = T2; updateHeight(x); updateHeight(y); return y; } // 插入节点 Node insertNode(Node node, int key) { if (node == null) { return new Node(key); } if (key < node.key) { node.left = insertNode(node.left, key); } else if (key > node.key) { node.right = insertNode(node.right, key); } else { return node; // 不允许插入重复的节点 } updateHeight(node); int balanceFactor = getBalanceFactor(node); // 左旋操作 if (balanceFactor > 1 && key < node.left.key) { return rotateRight(node); } // 右旋操作 if (balanceFactor < -1 && key > node.right.key) { return rotateLeft(node); } // 左右旋操作 if (balanceFactor > 1 && key > node.left.key) { node.left = rotateLeft(node.left); return rotateRight(node); } // 右左旋操作 if (balanceFactor < -1 && key < node.right.key) { node.right = rotateRight(node.right); return rotateLeft(node); } return node; } // 中序遍历 void inorderTraversal(Node node) { if (node != null) { inorderTraversal(node.left); System.out.print(node.key + " "); inorderTraversal(node.right); } } } // 测试代码 public class Main { public static void main(String[] args) { AVLTree tree = new AVLTree(); tree.root = tree.insertNode(tree.root, 10); tree.root = tree.insertNode(tree.root, 20); tree.root = tree.insertNode(tree.root, 30); tree.root = tree.insertNode(tree.root, 40); tree.root = tree.insertNode(tree.root, 50); tree.root = tree.insertNode(tree.root, 25); System.out.println("AVL树的升序遍历结果:"); tree.inorderTraversal(tree.root); } } ``` 运行以上代码,输出结果为:10 20 25 30 40 50,即AVL树的升序遍历结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值