JAVA实现平衡树

复习,上代码

package tree;

/**
 * Created by rightHead on 2017/3/4.
 */
public abstract class BalanceTree {

    private final class Node {
        T data;
        int equals;
        int deep;
        Node left, right, dad;
    }

    private Node root;
    private final int BF = 2;

    public void insert(T data) {
        if (root == null) {
            root = newNode(data, null);
        }
        else {
            executeInsert(data, root);
        }
    }

    private int deep(Node node) {
        if (node != null) {
            return node.deep;
        }else{
            return 0;
        }
    }
    private void adjustDeep(Node node, Node temp) {
        int leftHigh = deep(node.left);
        int rightHigh = deep(node.right);
        node.deep = leftHigh>rightHigh ? leftHigh+1 : rightHigh+1;
        leftHigh = deep(temp.left);
        rightHigh = node.deep;
        temp.deep = leftHigh>rightHigh ? leftHigh+1 : rightHigh+1;
    }
    private void adjustLeftLeft(Node node) {
        Node temp = node.left;
        node.left = temp.right;
        if (temp.right != null){
            temp.right.dad = node;
        }
        if (node.dad != null){
            if (node.dad.right == node){
                node.dad.right = temp;
            }else{
                node.dad.left = temp;
            }
        }
        temp.right = node;
        temp.dad = node.dad;
        node.dad = temp;
        if (node == root){
            root = temp;
        }
        // 下面调整树的深度
        adjustDeep(node, temp);
    }
    private void adjustRightRight(Node node) {
        Node temp = node.right;
        node.right = temp.left;
        if (temp.left != null){
            temp.left.dad = node;
        }
        if (node.dad != null){
            if (node.dad.right == node){
                node.dad.right = temp;
            }else{
                node.dad.left = temp;
            }
        }
        temp.left = node;
        temp.dad = node.dad;
        node.dad = temp;
        if (node == root){
            root = temp;
        }
        adjustDeep(node, temp);
    }
    private void adjustLeftRight(Node node) {
        adjustRightRight(node.left);
        adjustLeftLeft(node);
    }
    private void adjustRightLeft(Node node) {
        adjustLeftLeft(node.right);
        adjustRightRight(node);
    }
    private void countDeep(Node node) {
        int leftDeep = deep(node.left);
        int rightDeep = deep(node.right);
        node.deep = leftDeep >= rightDeep ? leftDeep+1 : rightDeep+1;
    }
    private void executeInsert(T data, Node node) {
        if (compare(node.data, data) == 1){
            // 要插入数据小于当前节点
            if (node.left != null){
                executeInsert(data, node.left);
                countDeep(node);
                if (deep(node.left) - deep(node.right) == BF){
                    // 深度到达2 开始旋转 新节点插在当前节点的左子树,所以左子树一定比右子树大
                    if (compare(node.left.data, data) == 1){
                        adjustLeftLeft(node);
                    }else{
                        adjustLeftRight(node);
                    }
                }
            }else{
                node.left = newNode(data, node);
                countDeep(node);
            }
        }else if (compare(node.data, data) == 2){
            if (node.right != null){
                executeInsert(data, node.right);
                countDeep(node);
                if (deep(node.right) - deep(node.left) == BF){
                    // 深度到达2 开始旋转 新节点插在当前节点的右子树,所以右子树一定比左子树大
                    if (compare(node.right.data, data) == 2){
                        adjustRightRight(node);
                    }else{
                        adjustRightLeft(node);
                    }
                }
            }else{
                node.right = newNode(data, node);
                countDeep(node);
            }
        }else {
            node.equals++;
        }
    }

    private Node newNode(T data, Node f) {
        Node node = new Node();
        node.data = data;
        node.equals = 0;
        node.deep = 1;
        node.dad = f;
        node.right = node.left = null;
        return node;
    }

    abstract int compare(T arg1, T arg2);

    public void leftOrderPrintf() {
        leftPrintf(root);
    }

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

    public void deleteAll() {
        root = null;
        // 直接抛弃整棵树, 把头节点的强引用赋空
    }

    public void delete(T data) {
        deleteNode(data, root);
    }

    private void deleteNode(T data, Node node) {
        Node temp1, temp2;
        if (node.data == data) {
            if (node.equals > 1){
                node.equals--;
            }else if (node.right!=null && node.left!=null){
                temp1 = node.right;
                while (temp1.left != null){
                    int leftHigh = deep(temp1.left)-1;
                    int rightHigh = deep(temp1.right);
                    temp1.deep = leftHigh>=rightHigh ? leftHigh : rightHigh;
                    temp1 = temp1.left;
                }
                node.data = temp1.data;
                temp2 = temp1.dad;
                temp2.left = null;
                if (deep(node.left) - deep(node.right) == BF){
                    if (deep(node.left.left) > deep(node.left.right)){
                        adjustLeftLeft(node);
                    }else{
                        adjustLeftRight(node);
                    }
                }
            }else{
                if (node.left != null){
                    temp1 = node.left;
                }else {
                    temp1 = node.right;
                }
                if (temp1 != null){
                    node.data = temp1.data;
                    node.deep--;
                    node.left = node.right = null;
                    temp1 = null;
                }else{
                    temp2 = node.dad;
                    if (temp2.left == node){
                        temp2.left = null;
                    }else{
                        temp2.right = null;
                    }
                    node = null;
                }
            }
            return;
        }else if (compare(node.data, data) == 1){
            if (node.left != null){
                deleteNode(data, node.left);
            }else{
                System.out.println("无此点");
            }
        }else if (compare(node.data, data) == 2){
            if (node.right != null){
                deleteNode(data, node.right);
            }else{
                System.out.println("无此点");
            }
        }
        int leftHigh = deep(node.left);
        int rightHigh = deep(node.right);
        node.deep = leftHigh>rightHigh ? leftHigh : rightHigh;
    }
}

测试程序

package tree;

/**
 * Created by rightHead on 2017/3/5.
 */
public class Test {
    public static void main(String[] args) {
        BalanceTree balanceTree = new BalanceTree() {
            @Override
            public int compare(Integer arg1, Integer arg2) {
                if (arg1 > arg2){
                    return 1;
                }else if (arg1 < arg2){
                    return 2;
                }else {
                    return 3;
                }
            }
        };
        // 8 4 5 7 6 9 2 1 3 0
        balanceTree.insert(8);
        balanceTree.insert(4);
        balanceTree.insert(5);
        balanceTree.insert(7);
        balanceTree.insert(6);
        balanceTree.insert(9);
        balanceTree.insert(2);
        balanceTree.insert(1);
        balanceTree.insert(3);
        balanceTree.insert(0);
        balanceTree.leftOrderPrintf();
        balanceTree.delete(3);
        System.out.println("xoxxoxoxoxoxoxoxo");
        balanceTree.leftOrderPrintf();
    }
}

你可能感兴趣的:(JAVA,数据结构)