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