javascript数据结构——写一个二叉搜索树
二叉搜索树就是左侧子节点值比根节点值小,右侧子节点值比根节点值大的二叉树。
照着书敲了一遍。
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数据结构——写一个二叉搜索树的更多相关文章
- 给定一个二叉搜索树(BST),找到树中第 K 小的节点
问题:给定一个二叉搜索树(BST),找到树中第 K 小的节点. 出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家. 考察点: 1. 基础数据结构的理解和编码能力 2. 递归使用 参考答案 ...
- javascript 数据结构与算法---二叉数
二叉树,首先了解一些关于二叉数的概念(来自百度百科) 1. 二叉树(Binary tree)是树形结构的一个重要类型 2. 定义: 二叉树(binary tree)是指树中节点的度不大于2的有序树,它 ...
- [数据结构]P2.1 二叉搜索树
二叉树就是每个节点最多有两个分叉的树.这里我们写一写一个典型的例子二叉搜索树,它存在的实际意义是什么呢? 在P1.1链表中,我们清楚了链表的优势是善于删除添加节点,但是其取值很慢:数组的优势是善于取值 ...
- 《剑指offer》— JavaScript(26)二叉搜索树与双向链表
二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 递归思想:把大问题转换为若干小问题: 由于Ja ...
- 《剑指offer》— JavaScript(23)二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 相关知识 二叉查找树(B ...
- PTA 数据结构——是否完全二叉搜索树
7-2 是否完全二叉搜索树 (30 分) 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格 ...
- 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用
一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点: 如果找到了,删除它. 说明: 要求算法时间复杂度为 O(h),h 为树的高度. 示例: root = [5,3,6,2,4,null,7] ...
- 2020-07-31:给定一个二叉搜索树(BST),找到树中第K 小的节点。
福哥答案2020-07-31: BST 的中序遍历是升序序列.1.递归法.时间复杂度:O(N),遍历了整个树.空间复杂度:O(N),用了一个数组存储中序序列.2.迭代法.时间复杂度:O(H+k),其中 ...
- javascript实现二叉搜索树
在使用javascript实现基本的数据结构中,练习了好几周,对基本的数据结构如 栈.队列.链表.集合.哈希表.树.图等内容进行了总结并且写了笔记和代码. 在 github中可以看到 点击查看,可以 ...
随机推荐
- Android蓝牙传感应用
Android手机一般以客户端的角色主动连接SPP协议设备(接上蓝牙模块的数字传感器),连接流程是: 1.使用registerReceiver注册BroadcastReceiver来获取蓝牙状态.搜索 ...
- 【JavaScript】关于js的一些理解
嵌套函数即作用域链:嵌套函数即闭包 函数表达式即延迟执行 匿名函数----------->实现块级作用域 call会切换到调用的对象参数环境.
- Html Agility Pack基础类介绍及运用
第一篇只对Html Agility Pack做了一个大概的介绍,在接下来的章节会比较深入的介绍Html Agility Pack. Html Agility Pack 源码中的类大概有28个左右,其实 ...
- HTML <base> 标签
定义和用法 <base> 标签为页面上的所有链接规定默认地址或默认目标. 通常情况下,浏览器会从当前文档的 URL 中提取相应的元素来填写相对 URL 中的空白. 使用 <base& ...
- iOS开发——图层OC篇&Quartz 2D各种绘制实例
Quartz 2D各种绘制实例 首先说一下,本篇文章只是介绍怎么使用Quartz 2D绘制一些常用的图像效果,关于Quartz和其他相关技术请查看笔者之前写的完整版(Quartz 2D详解) 一:画线 ...
- javascript 基本数据类型
1. javascript 五种基本数据类型 Undefined Boolean Number String Null,Undefined 对应的值只有一个 undefined, Boolean 对 ...
- java Servlet接口及应用
基本类和接口 一.javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理 ...
- 随机 I/O & 顺序 I/O
在谈这俩概念前.先来说说 大I/O vs. 小I/O 通常.我们把 <=16KB 的I/O认为是小I/O.而 >=32KB 的I/O认为是大I/O 了解I/O的大小.影响到 ...
- spring security源码分析之一springSecurityFilterChain
1. spring和spring security的集成,配置web.xml如下: <context-param> <param-name>contextConfigLocat ...
- 乐观锁(optimistic locking)与悲观锁(pessimistic locking)
首先,乐观锁(optimistic locking)与悲观锁(pessimistic locking)基本是针对数据处理来说,也就是跟数据库有关的术语,目的是为了解决并发处理时所遇到的相关性能问题,以 ...