37.1:sizeBalanceTree

package algorithmbasic.basicsets.class37;

public class sizeBalanceTree {
    public static class SBTNode<K extends Comparable<K>, V> {
        public K key;
        public V value;
        public int size;
        public SBTNode<K, V> left;
        public SBTNode<K, V> right;

        public SBTNode(K key, V value) {
            this.key = key;
            this.value = value;
            size = 0;
        }
    }

    public static class SizeBalancedTreeMap<K extends Comparable<K>, V> {
        public SBTNode<K, V> add(SBTNode<K, V> cur, K key, V value) {
            if (cur == null) {
                return new SBTNode<>(key, value);
            }
            if (cur.key.compareTo(key) < 0) {
                cur.right = add(cur.right, key, value);
            } else {
                cur.left = add(cur.left, key, value);
            }
            cur.size++;
            return mainTain(cur);
        }

        public SBTNode<K, V> delete(SBTNode<K, V> cur, K key) {
            if (cur.key.compareTo(key) < 0) {
                cur.right = delete(cur.right, key);
            } else if (cur.key.compareTo(key) > 0) {
                cur.left = delete(cur.left, key);
            } else {
                if (cur.left == null && cur.right == null) {
                    return null;
                } else if (cur.left == null) {
                    return cur.right;
                } else if (cur.right == null) {
                    return cur.left;
                } else {
                    // --------------------- begin - hardThinking---------------------
                    SBTNode<K, V> des = cur.right;
                    SBTNode<K, V> pre = null;
                    while (des.left != null) {
                        pre = des;
                        pre.size--;
                        des = des.left;
                    }
                    if (pre != null) {
                        pre.left = des.right;
                        des.right = cur.right;
                    }
                    des.left = cur.left;
                    des.size = cur.left.size + (des.right == null ? 0 : des.right.size) + 1;
                    cur = des;
                    // --------------------- end ---------------------
                }
            }
            return cur;
        }

        public SBTNode<K, V> mainTain(SBTNode<K, V> cur) {
            if (cur == null) {
                return null;
            }
            int leftSzie = cur.left == null ? 0 : cur.left.size;
            int leftLeftSize = cur.left != null && cur.left.left != null ? cur.left.left.size : 0;
            int leftRightSize = cur.left != null && cur.left.right != null ? cur.left.right.size : 0;
            int rightSzie = cur.right == null ? 0 : cur.right.size;
            int rightLeftSize = cur.right != null && cur.right.left != null ? cur.right.left.size : 0;
            int rightRightSize = cur.right != null && cur.right.right != null ? cur.right.right.size : 0;

            if (leftLeftSize > rightSzie) {// LL
                cur = rightRotate(cur);
                cur.left = mainTain(cur.left);
                cur = mainTain(cur);
            } else if (leftRightSize > rightSzie) {// LR
                cur.left = leftRotate(cur.left);
                cur = rightRotate(cur);
                cur.left = mainTain(cur.left);
                cur.right = mainTain(cur.right);
                cur = mainTain(cur);
            } else if (rightLeftSize > leftSzie) {// RL
                cur.right = rightRotate(cur.right);
                cur = leftRotate(cur);
                cur.left = mainTain(cur.left);
                cur.right = mainTain(cur.right);
                cur = mainTain(cur);
            } else if (rightRightSize > leftSzie) {// RR
                cur = leftRotate(cur);
                cur.left = mainTain(cur.left);
                cur = mainTain(cur);
            }
            return cur;
        }

        public SBTNode<K, V> leftRotate(SBTNode<K, V> cur) {
            if (cur == null) {
                return null;
            }
            SBTNode<K, V> right = cur.right;
            cur.right = right.left;
            right.left = cur;
            right.size = cur.size;//cur之前是整棵树的头节点,size是整棵树的size
            cur.size = (cur.right == null ? 0 : cur.right.size) + (cur.left == null ? 0 : cur.left.size) + 1;
            return right;
        }

        public SBTNode<K, V> rightRotate(SBTNode<K, V> cur) {
            if (cur == null) {
                return null;
            }
            SBTNode<K, V> left = cur.left;
            cur.left = left.right;
            left.right = cur;
            left.size = cur.size;//cur之前是整棵树的头节点,size是整棵树的size
            cur.size = (cur.left == null ? 0 : cur.left.size) + (cur.right == null ? 0 : cur.right.size) + 1;
            return left;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HackerTerry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值