javascript AVL树算法与说明

来源:互联网 发布:网络直播怎么兴起的 编辑:程序博客网 时间:2024/06/16 05:08

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

原创粉丝点击