使用ES6实现二分搜索树

  • 二分搜索树(BST)是二叉树的一种,只允许在左侧节点存储比父节点小的值,在右侧节点存储比自己大的值

二分搜索树的实现

  • 创建一个BinarySearchTree类
function BinarySearchTree(){
    //声明一个Node类来表示树中的每个节点
    var Node=function(key){
    this.key=key;
    this.left=null;
    this.right=null;
    }
    var root=null;
 }
复制代码
  • 声明一个Node类来表示树中的每个节点 令根节点为空(null)

向树中插入一个值

 this.insert=function(key){
    var newNode=new Node(key);
    // 根节点为空的话 就直接插在根节点
    if(root===null){
        root=newNode;
    }else{
        insertNode(root,newNode)
 }
}
var insertNode = function(node,newNode){
/*判断新插入节点的键值与当前节点键值的大小 先插入键值小的话 就插入左侧的节点 再判断左侧节点是否为空 是空 就在那里插入新的节点 否则就需要递归来继续找到树的下一层*/
    if(newNode.key<node.key){
        if(node.left===null){
              node.left=newNode;
         }else{
           insertNode(node.left,newNode)
         }
        }else{
            if(node.right===null){
                node.right=newNode;
              }else{
                insertNode(node.right,newNode)
              }
            }
          }
复制代码

树的遍历

  • 遍历一棵树是访问树的每一个节点并对它们进行某种操作
  • 有三种遍历的方法:
  1. 前序遍历(先序遍历) 前序遍历是优先于后代节点的顺序访问每个节点,会先访问及节点本身,然后再去访问它的左节点和右节点
this.preOrder=function(){
  preOrderNode(root);
}
var preOrderNode=function(node){
  if(node !== null) {
  //先访问节点 对节点进行打印 然后再访问左节点和右节点
    console.log(node.key);
    preOrderNode(node.left);
    preOrderNode(node.right);
  }
}
复制代码
  1. 中序遍历 实现从小到大的顺序访问所有的节点
this.inOrder=function(){
    inOrderNode(root);
}
//使用一个辅助函数来接受一个节点来作为参数
var inOrderNode=function(node){
if(node !== null){
   inOrderNode(node.left);
   console.log(node.key);
   inOrderNode(node.right);
 }
}
复制代码
  1. 后序遍历 先访问后代节点,再访问节点本身 应用是计算一个目录和它的子目录中所有文件所占的空间
this.postOrder=function(){
 postOrderNode(root);
}
var postOrderNode=function(node){
if(node !== null){
    postOrderNode(node.left);
    postOrderNode(node.right);
    console.log(node.key);
 }
}
复制代码

搜索最小值和最大值

  • 搜索最小值 一棵树的最小值就在它的最左侧的节点
    this.min=function(){
        return minNode(root);
    }
    var minNode=function(node){
    if(node){
      while(node&&node.left!==null){
      node=node.left;
    }
    return node.key
    }
    return null;
}
复制代码
  • 寻找最大值就是沿着树的最右侧寻找 直到它的右侧节点为空 就找到了最大值
 this.max=function(){
        return maxNode(root);
    }
    var maxNode=function(node){
    if(node){
      while(node&&node.right!==null){
            node=node.right;
        }
        return node.key
    }
    return null;
}
复制代码
  • 搜索一个特定的值 就是先与根节点进行判断, 如果根节点为空 ,则没有这个值 否则就让特定的值与根节点进行比较,比根节点键值小,就在左侧进行寻找,反之在右侧寻找
this.search = function(key){
    return searchNode(root,key);
}
var searchNode=function(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;
    }
}
复制代码

引用《学习JavaScript数据结构与算法》

转载于:https://juejin.im/post/5b740fae5188257f2d290094

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值