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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章