javascript AVL树算法与说明

AVL树的介绍

AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 “An algorithm for the organization of information” 中发表了它。AVL树是一种自平衡二叉搜索树,意思是任何一个节点左右两节点的高度之差最多为1。实际应用中,维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应用不多。windows对进程地址空间的管理用到了AVL树。


ES6散列表完整实现代码:

let AVLTree = (function() {
    class Node {
        constructor(key) {
            this.key = key;
            this.left = null;
            this.right = null;
        }
    }

    class AVLTree {
        constructor() {
            this.root = null;
            this.parentNode;
            this.nodeToBeDeleted;
        }

        getRoot() {
            return this.root;
        };

        heightNode(node) {
            if(node === null) {
                return -1;
            } else {
                return Math.max(this.heightNode(node.left), this.heightNode(node.right)) + 1;
            }
        };

        rotationLL(node) {
            var tmp = node.left;
            node.left = tmp.right;
            tmp.right = node;

            return tmp;
        };

        rotationRR(node) {
            var tmp = node.right;
            node.right = tmp.left;
            tmp.left = node;

            return tmp;
        };

        rotationLR(node) {
            node.left = this.rotationRR(node.left);
            return this.rotationLL(node);
        };

        rotationRL(node) {
            node.right = this.rotationLL(node.right);
            return this.rotationRR(node);
        };

        insertNode(node, element) {

            if(node === null) {
                node = new Node(element);

            } else if(element < node.key) {

                node.left = this.insertNode(node.left, element);

                if(node.left !== null) {

                    if((this.heightNode(node.left) - this.heightNode(node.right)) > 1) {
                        if(element < node.left.key) {
                            node = this.rotationLL(node);
                        } else {
                            node = this.rotationLR(node);
                        }
                    }
                }
            } else if(element > node.key) {

                node.right = this.insertNode(node.right, element);

                if(node.right !== null) {

                    if((this.heightNode(node.right) - this.heightNode(node.left)) > 1) {

                        if(element > node.right.key) {
                            node = this.rotationRR(node);
                        } else {
                            node = this.rotationRL(node);
                        }
                    }
                }
            }

            return node;
        };

        insert(element) {
            this.root = this.insertNode(this.root, element);
        };


        removeNode(node, element) {
            if(node === null) {
                return null;
            }
            this.parentNode = node;

            if(element < node.key) {
                node.left = removeNode(node.left, element);
            } else {
                nodeToBeDeleted = node;
                node.right = removeNode(node.right, element);
            }

            if(node === this.parentNode) { 
                if(nodeToBeDeleted !== null && element === nodeToBeDeleted.key) {
                    if(nodeToBeDeleted === this.parentNode) {
                        node = node.left;
                    } else {
                        var tmp = nodeToBeDeleted.key;
                        nodeToBeDeleted.key = parentNode.key;
                        parentNode.key = tmp;
                        node = node.right;
                    }
                }
            } else { 

                if(node.left === undefined) node.left = null;
                if(node.right === undefined) node.right = null;

                if((this.heightNode(node.left) - this.heightNode(node.right)) === 2) {
                    if(element < node.left.key) {
                        node = this.rotationLR(node);
                    } else {
                        node = this.rotationLL(node);
                    }
                }

                if((this.heightNode(node.right) - this.heightNode(node.left)) === 2) {
                    if(element > node.right.key) {
                        node = this.rotationRL(node);
                    } else {
                        node = this.rotationRR(node);
                    }
                }
            }

            return node;
        };

        remove(element) {
            parentNode = null;
            nodeToBeDeleted = null;
            root = this.removeNode(root, element);
        };
    }
    return AVLTree;
})()

用法实例

var avlTree = new AVLTree();

avlTree.insert(1);
avlTree.insert(2);
avlTree.insert(3);
avlTree.insert(4);
avlTree.insert(5);
avlTree.insert(6);
avlTree.insert(7);
avlTree.insert(14);
avlTree.insert(15);
avlTree.insert(13);
avlTree.insert(12);
avlTree.insert(11);

avlTree.getRoot();

相关文章

javascript 二叉树(Trees)算法与说明:http://blog.csdn.net/rth362147773/article/details/77996814
javascript 红黑树算法与说明:http://blog.csdn.net/rth362147773/article/details/78014688

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值