这是一个有效的AVL树插入功能吗?

时间:2013-12-28 06:16:29

标签: java binary-search-tree avl-tree

我跟着老师说的话似乎有效,但这里看起来很奇怪......

首先,这是应该将新元素插入AVL树的类。

public class AVLTree<T> {
    private AVLTreeNode<T> root;

    public void insert(TreeElem<T> data) {
        if(root == null) 
            root = new AVLTreeNode<>(data, 0, null, null);
            else 
                insert(root, data, 0);
    }


    private void insert(AVLTreeNode<T> root, TreeElem<T> x, int height) {
//      root.setHeight(Math.max(root.getRight().getHeight(), root.getLeft().getHeight()) + 1);
        if(x.lessThan(root.getElem())) {
            if(root.getLeft() == null) {
                root.setLeft(new AVLTreeNode<>(x, height, null, null));
                if(Math.abs(root.getLeft().getHeight() - (root.getRight() == null ? 0 : root.getRight().getHeight())) == 2) 
                    if(x.lessThan(root.getLeft().getElem()))
                        rotateLeft(root);
                    else
                        doubleLeftRotate(root);
            } else 
                insert(root.getLeft(), x, height + 1);
        } else if(x.greaterThan(root.getElem())) {
            if(root.getRight() == null)  {
                root.setRight(new AVLTreeNode<>(x, height, null, null));
                if(Math.abs((root.getLeft() == null ? 0 : root.getLeft().getHeight()) - root.getRight().getHeight()) == 2)
                    if(x.lessThan(root.getLeft().getElem()))
                        rotateRight(root);
                    else
                        doubleRightRotate(root);
            } else 
                insert(root.getRight(), x, height + 1);
        }

        System.out.println((root.getRight() == null ? 0 : root.getRight().getHeight()) - (root.getLeft() == null ? 0 : root.getLeft().getHeight()));
    }


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

    private void print(AVLTreeNode<T> root) {
        if(root == null) return;
        System.out.println(root.getElem().toString());
        print(root.getLeft());
        print(root.getRight());
    }

    /***************************************
     ************ ROTATIONS ****************
     ***************************************/

    private void rotateLeft(AVLTreeNode<T> node) {
        // Swap node with node.left
        AVLTreeNode<T> temp = node, right = temp.getRight();
        // 
        node.setElem(right.getElem());
        node.setHeight(right.getHeight());
        node.setLeft(right.getLeft());
        node.setRight(right.getRight());
        // set root
        right.setElem(temp.getElem());
        right.setHeight(temp.getHeight());
        right.setRight(temp.getRight());
        right.setLeft(temp.getLeft());
        // 
        node.setLeft(node.getRight());
        node.setRight(null);

    }

    private void rotateRight(AVLTreeNode<T> node) {
        // Swap node with node.left
        AVLTreeNode<T> temp = node, left = temp.getLeft();
        // 
        node.setElem(left.getElem());
        node.setHeight(left.getHeight());
        node.setLeft(left.getLeft());
        node.setRight(left.getRight());
        // set root
        left.setElem(temp.getElem());
        left.setHeight(temp.getHeight());
        left.setRight(temp.getRight());
        left.setLeft(temp.getLeft());
        // 
        node.setRight(node.getLeft());
        node.setLeft(null);
    }

    private void doubleLeftRotate(AVLTreeNode<T> node) {
        rotateRight(node.getRight());
        rotateLeft(node);
    }

    private void doubleRightRotate(AVLTreeNode<T> node) {
        rotateLeft(node.getLeft());
        rotateRight(node);
    }
}

根据我的测试课,似乎有效。

但我在这里无法理解:

目前:

                if(x.lessThan(root.getLeft().getElem()))
                    rotateLeft(root);
                else
                    doubleLeftRotate(root);

我应该检查x是否小于root.getLeft,

如果我将左侧指定为x?

TreeElem是一个类似的界面。

但重点是:

我的插入方法好不好?

0 个答案:

没有答案
相关问题