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