二叉搜索树就是左侧子节点值比根节点值小,右侧子节点值比根节点值大的二叉树。

照着书敲了一遍。

function BinarySearchTree(){
var Node = function(key){
this.key = key
this.left = null
this.right = null
} var root = 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.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
}
} //callback,调用遍历时作为参数传入
function printNode(value){
//打印节点值
console.log(value)
} this.inOrderTraverse = function(callback){
//中序遍历
inOrderTraverseNode(root,callback)
}
//中序遍历辅助函数
var inOrderTraverseNode = function(node,callback){
if(node != null){
inOrderTraverseNode(node.left,callback)
callback(node.key)
inOrderTraverseNode(node.right,callback)
}
} 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(){
//后序遍历
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(){
//寻找最小值
//最小值往二叉搜索树最左侧寻找
return minNode(root)
}
var minNode = function(node){
if(node){
while(node && node.left!=null){
node = node.left
} return node.key
}else{
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
}else{
return null
}
} //remove这个方法,我一开始没有搞懂为什么要令root = removeNode(root,key)
//反复研究了几遍代码之后我才看明白了是为了更新节点
//包括之后的removeNode方法
//每一次递归更新子节点,最后还有return node更新父节点
//因为此时父节点node的子节点已经不一样了,所以需要更新
this.remove = function(key){
root = removeNode(root,key)
}
var removeNode = function(node,key){
if(node === null){
return null
} if(key < node.key){
node.left = removeNode(node.left,key)
return node
}else if(key > node.key){
node.right = removeNode(node.right,key)
return node
}else{
//key === node.key if(node.left === null && node.right === null){
//删除节点为叶子结点
node = null
return node
}
//删除的节点只有一个子节点
if(node.left === null){
node = node.right
return node
}else if(node.right === null){
node = node.left
return node
} //删除的节点有两个子节点
//从右侧子节点里寻找出最小的节点来继承当前节点
//然后删除那个最小的右侧子节点
var aux = findMinNode(node.right)
node.key = aux.key
node.right = removeNode(node.right,aux.key)
return node
}
}
var findMinNode = function(node){
if(node){
while(node && node.left!=null){
node = node.left
} return node
}else{
return null
}
}
}

javascript数据结构——写一个二叉搜索树的更多相关文章

  1. 给定一个二叉搜索树(BST),找到树中第 K 小的节点

    问题:给定一个二叉搜索树(BST),找到树中第 K 小的节点. 出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家. 考察点: 1. 基础数据结构的理解和编码能力 2.  递归使用 参考答案 ...

  2. javascript 数据结构与算法---二叉数

    二叉树,首先了解一些关于二叉数的概念(来自百度百科) 1. 二叉树(Binary tree)是树形结构的一个重要类型 2. 定义: 二叉树(binary tree)是指树中节点的度不大于2的有序树,它 ...

  3. [数据结构]P2.1 二叉搜索树

    二叉树就是每个节点最多有两个分叉的树.这里我们写一写一个典型的例子二叉搜索树,它存在的实际意义是什么呢? 在P1.1链表中,我们清楚了链表的优势是善于删除添加节点,但是其取值很慢:数组的优势是善于取值 ...

  4. 《剑指offer》— JavaScript(26)二叉搜索树与双向链表

    二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 递归思想:把大问题转换为若干小问题: 由于Ja ...

  5. 《剑指offer》— JavaScript(23)二叉搜索树的后序遍历序列

    二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 相关知识 二叉查找树(B ...

  6. PTA 数据结构——是否完全二叉搜索树

    7-2 是否完全二叉搜索树 (30 分) 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格 ...

  7. 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用

    一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点: 如果找到了,删除它. 说明: 要求算法时间复杂度为 O(h),h 为树的高度. 示例: root = [5,3,6,2,4,null,7] ...

  8. 2020-07-31:给定一个二叉搜索树(BST),找到树中第K 小的节点。

    福哥答案2020-07-31: BST 的中序遍历是升序序列.1.递归法.时间复杂度:O(N),遍历了整个树.空间复杂度:O(N),用了一个数组存储中序序列.2.迭代法.时间复杂度:O(H+k),其中 ...

  9. javascript实现二叉搜索树

    在使用javascript实现基本的数据结构中,练习了好几周,对基本的数据结构如 栈.队列.链表.集合.哈希表.树.图等内容进行了总结并且写了笔记和代码. 在 github中可以看到  点击查看,可以 ...

随机推荐

  1. ProgressBarLayoutView

    https://github.com/alter-ego/ProgressBarLayoutView

  2. Linux - wc统计文件行数、单词数或字节数

    一 wc简单介绍 wc命令用来打印文件的文本行数.单词数.字节数等(print the number of newlines, words, and bytes in files).在Windows的 ...

  3. range与xrange之间的差异(转)

    range 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列.range示例: >>> ra ...

  4. MySQL执行SHOW STATUS查询服务器状态状态之Handler_read_* 详解

    在MySQL里,我们一般使用SHOW STATUS查询服务器状态,语法一般来说如下: SHOW [GLOBAL | SESSION] STATUS [LIKE ‘pattern’ | WHERE ex ...

  5. Visual Studio Code 1.0.1 for python

    1. 安 F1健 ext install python E:\test\.vscode下的三个文件 2.launch.json { "version": "0.1.0&q ...

  6. 项目源码--IOS自定义视频播放器

    下载源码 技术要点: 1. 视频播放器功能的实现 2. 视频文件的扫描与管理 3. Ipad UI的实现 4.源码详细的中文注释 ……. 详细介绍: 1. 视频播放器功能的实现 源码基于MediaPl ...

  7. 用PredicateBuilder实现Linq动态拼接查询

    在使用Linq查询的时候,特别是如果你在使用Entiry Framwork,有时会遇到动态查询的情况(客户的查询条件是不固定的拼接查询).我们能想到的第一方案应该是拼接SQL,的确这样是可以达到我们的 ...

  8. EF——使用Data Annotations和Fluent API配置数据库的映射配置 02.01(转)

    要更改EF中的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面;还有一个就 ...

  9. 【阿里云产品公测】大数据下精确快速搜索OpenSearch

    [阿里云产品公测]大数据下精确快速搜索OpenSearch 作者:阿里云用户小柒2012 相信做过一两个项目的人都会遇到上级要求做一个类似百度或者谷歌的站内搜索功能.传统的sql查询只能使用like ...

  10. 【Open Search产品评测】- 来往,7天轻松定制属于自己的搜索引擎

    [Open Search产品评测]--   来往,7天轻松定制属于自己的搜索引擎   [使用背景] 相信很多人都遇到过要给网站或者app做一个搜索功能的需求,很久之前自己折腾过lucene,搞了很久, ...