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中可以看到 点击查看,可以 ...
随机推荐
- 使用NuGet安装EntityFramework4.2
1.下载NuGet 有两种方式下载NuGet 第一种:在微软的档案库下载,下载地址为:http://visualstudiogallery.msdn.microsoft.com/27077b70-9d ...
- [Angular2 Router] Optional Route Query Parameters - The queryParams Directive and the Query Parameters Observable
In this tutorial we are going to learn how to use the Angular 2 router to pass optional query parame ...
- windows 支持curl命令
curl 是一般linux发行版中都带有的小工具,利用这个工具可以很方便的下载文件, 我一般使用这个工具来查看某个页面相应的HTTP头信息,在Windows系统中我们也一样可以使用这个工具,如果不需要 ...
- java整理软件--- Java OCR 图像智能字符识别技术,可识别中文,但是验证码不可以识别...已测识别中文效果很好
国内最专业的OCR软件只有2家,清华TH-OCR和汉王OCR,看了很多的OCR技术 发现好多对英文与数字的支持都很好,可惜很多都不支持中文字符.Asprise-OCR,Tesseract 3.0以前的 ...
- uva 12096 The SetStack Computer
点击打开链接uva 12096 思路: STL模拟 分析: 1 题目给定5种操作,每次输出栈顶集合的元素的个数 2 利用stack和set来模拟,set保存集合的元素.遇到push的时候直接在stac ...
- ubuntu thrift 0.9.3编译安装
Table of Contents 1. 下载thrift源代码 2. 编译并安装 3. 运行测试程序 4. 安装 1 下载thrift源代码 git clone https://git-wip-us ...
- 常见hash算法的原理
散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫 ...
- Data Structure 之 二叉树
在计算机科学中,二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用于实现二叉查找树和二叉堆 ...
- Hastiness
Problem Description How many problems did you AC?When you read this problem, don’t hasty and careles ...
- Linux 查看物理内存
free -k free -m free -b man free cat /proc/meminfo