(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.csdn.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;}

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值