数据结构与算法--AVL数实现有序表


public class Code_AVLTreeMap {
    public static class AVLNode<K extends Comparable<K>, V>{
        public K k;
        public V v;
        public AVLNode<K, V> l;
        public AVLNode<K, V> r;
        public int h;

        public AVLNode(K key, V value){
            k = key;
            v = value;
            h = 1;
        }
    }

    public static class AVLTreeMap<K extends Comparable<K>,V>{
        private AVLNode<K, V> root;
        private int size;

        public AVLTreeMap(){
            root = null;
            size = 0;
        }

        // 右旋
        private AVLNode<K,V> rightRotate(AVLNode<K,V> cur){
            AVLNode<K,V> left = cur.l;
            cur.l = left.r;
            left.r = cur;
            cur.h = Math.max((cur.l != null ? cur.l.h : 0), (cur.r != null ? cur.r.h : 0)) + 1;
            left.h = Math.max((left.l != null ? left.l.h : 0), (left.r != null ? left.r.h : 0)) + 1;
            return left;
        }

        // 左旋
        private AVLNode<K,V> leftRotate(AVLNode<K,V> cur){
            AVLNode<K,V> right = cur.r;
            cur.r = right.l;
            right.l = cur;
            cur.h = Math.max((cur.l != null ? cur.l.h : 0), (cur.r != null ? cur.r.h : 0)) + 1;
            right.h = Math.max((right.l != null ? right.l.h : 0), (right.r != null ? right.r.h : 0)) + 1;
            return right;
        }

        // 调整树的平衡性
        private AVLNode<K,V> maintain(AVLNode<K, V> cur){
            if(cur == null){
                return null;
            }

            int leftHeight = cur.l != null ? cur.l.h : 0;
            int rightHeight = cur.r != null ? cur.r.h : 0;
            if(Math.abs(leftHeight - rightHeight) > 1){
                if (leftHeight > rightHeight){
                    int leftLeftHeight = cur.l != null && cur.l.l != null ? cur.l.l.h : 0;
                    int leftRightHeight = cur.l != null  && cur.l.r != null ? cur.l.r.h : 0;
                    if(leftLeftHeight >= leftRightHeight){
                        cur = rightRotate(cur);
                    }else{
                        cur.l = leftRotate(cur.l);
                        cur = rightRotate(cur);
                    }
                }else{
                    int rightLeftHeight = cur.r != null && cur.r.l != null ? cur.r.l.h : 0;
                    int rightRightHeight = cur.r != null  && cur.r.r != null ? cur.r.r.h : 0;
                    if(rightRightHeight >= rightLeftHeight){
                        cur = leftRotate(cur);
                    }else{
                        cur.r = rightRotate(cur.r);
                        cur = leftRotate(cur);
                    }
                }
            }
            return cur;
        }

        private AVLNode<K,V> add(AVLNode<K,V> cur, K key, V value){
            if(cur == null){
                return new AVLNode<K,V>(key,value);
            }else{
                if(key.compareTo(cur.k) < 0){
                    cur.l = add(cur.l,key,value);
                }else{
                    cur.r = add(cur.r,key,value);
                }
                cur.h = Math.max(cur.l != null ? cur.l.h : 0, cur.r != null ? cur.r.h : 0) + 1;
                return maintain(cur);
            }
        }

        private AVLNode<K,V> delete(AVLNode<K,V> cur, K key){
            if(key.compareTo(cur.k) > 0){
                cur.r = delete(cur.r, key);
            }else  if(key.compareTo(cur.k) < 0){
                cur.l = delete(cur.l,key);
            }else{
                if(cur.l == null && cur.r == null){
                    cur = null;
                }else if(cur.l == null && cur.r != null){
                    cur = cur.r;
                }else if(cur.l != null && cur.r == null){
                    cur = cur.l;
                }else{
                    AVLNode<K,V> des = cur.r;
                    while(des.l != null){
                        des = des.l;
                    }

                    cur.r = delete(cur.r,des.k);
                    des.l = cur.l;
                    des.r = cur.r;
                    cur = des;
                }
            }

            if(cur != null){
                cur.h = Math.max(cur.l != null ? cur.l.h : 0, cur.r != null ? cur.r.h : 0) + 1;
            }
            return maintain(cur);
        }
    }













}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值