(BST)二叉搜索树BinarySearchTree类
二叉树就是每个节点只允许开两个叉的树。
二叉搜索树就是每个节点中有两个子节点,左边的子节点必须比父节点小,右边比父节点大。
二叉搜索树数据结构类似于双向链表,每个节点有两个指针,一个指向左边,一个指向右边,节点我们此时唤为键。
使用类似于链表的方式:创建辅助类node,表示每一个节点/项/键。
现在让我们创建类吧:
function BinarySearchTree( key){
var Node=function(key){
this.key=key;
this.left=null;
this.right=null;
}
var root=null; //根节点为null;
}
插入键insert()函数:
this.insert=function(key){
var newNode=new Node(key); //创建一个新键实例;
if(root===null){ //如果根节点为空,则将刚创建的新键作为根节点;
root=newNode;
}else{ //如果根节点不为空,则利用辅助类insetRoot() 把键插入到适当的位置。
insertRoot(root,newNode);
}
}
创建辅助类函数insertRoot():接受两个参数,一个父节点,一个新插入的子节点;子节点和父节点比较大小,如果比父节点小且父节点的左边为null,则令父节点的左边等于新节点; 如果比父节点小但父节点左边不为null,(则进行递归)和父节点的左边子节点比较,若比它小,再询问它左边是否为null......
function inserRoot(node, newNode){
if(newnode.key<node.key){
if(node.left==null){
node.left=newnode;
}else{
insernode(node.left,newNode)}
}else{
if(node.right==null){
node.right=newnode;
}else{
insertNode(node.right, newNode)}
}}
树的遍历:中序遍历,先序遍历,后续遍历
中序遍历:
this.inOrderTraverse=function(callback){
inOrderTraverseNode(root, callback);
}
var inOrderTraverseNode(node, callback){
if(node!==null){
inOrderTraverseNode(node.left,callback);
callback(node.key);
inOrderTraverseNode(node.right, callback);
}
关于中序遍历的详细代码执行顺序看另一篇文章:
https://mp.****.net/postedit/82112652
先序遍历:
this.preOrderTraverse = function(callback){
preOrderTraverseNode(root, callback);
};
var preOrderTraverseNode = function (node, callback) {
if (node !== null) {
callback(node.key);
preOrderTraverseNode(node.left, callback);
preOrderTraverseNode(node.right, callback);
} };
后序遍历:
this.postOrderTraverse = function(callback){
postOrderTraverseNode(root, callback); };
var postOrderTraverseNode = function (node, callback) {
if (node !== null) {
postOrderTraverseNode(node.left, callback);
postOrderTraverseNode(node.right, callback);
callback(node.key);
} };
寻找数字:最小值,最大值,特定的值;
最小值:
this.min=function(root){
return minNode(root);
}
var minNode(){
if(node){
while(node&&node.left){
node=node.left;
}
return node.key;
}return null;
}
最大值:
this.max=function(root){
return maxNode(root);
}
var maxNode(node){
if(node){
while(node&&node.right){
node=node.right;
}
return node.key;
}return null;
}
寻找特定的值:
this.search=function( key){
return searchNode(root,key);
}
var searchNode(node, key){
if(node===null){
return false;
}
if(key<node.key){
return searchNode(node.left, key);
}
else if(key>node.key){
return searchNode(node.right,key);}
else {return true;}
}