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中可以看到 点击查看,可以 ...
随机推荐
- 2012 East Central Regional Contest 解题报告
昨晚各种莫名其妙卡题. 不过细看这套题还挺简单的.全是各种暴力. 除了最后一道题计算几何看起来很麻烦的样子,其他题都是很好写的吧. A. Babs' Box Boutique 题目大意是给出不超过10 ...
- android环境部署(1.1)
前言 对于android文件的解释和说明下载,这里分享一个博客大家了解吧.这里作者提供的下载地址可能有无效的,关键是解析..... 转自:http://www.cnblogs.com/bjzhangh ...
- oc-25-id类型
/** id:万能指针 能够指向任何OC对象. id = NSObject *, id cat = [Cat new]; [cat jump]; NSObject:是所有类的父类,基类.可以指向任何O ...
- [转]SQL快速入门
原文出处:http://blog.csdn.net/xxd851116/article/details/5688263 一.基础 1.说明:创建数据库CREATE DATABASE database- ...
- 关于c中的%x及其它格式化符
原文:http://blog.csdn.net/lincyang/article/details/6252443 格式化: %x表示按16进制输出:int a = 16;%02x:输出10:%03x: ...
- 基于jQuery的宽屏可左右切换的焦点图插件
之前分享了很多实用的jQuery焦点图插件,大家可以看看.今天要继续为大家分享一款很不错的jQuery焦点图插件,它是宽屏展示的,而且有两个大气的按钮用来左右切换图片.效果图如下: 在线预览 源码 ...
- Golang学习 - fmt 包
------------------------------------------------------------ // Print 将参数列表 a 中的各个参数转换为字符串并写入到标准输出中. ...
- Java再学习——深究static关键字
一.static关键字的用途 可以在没有创建对象的情况下来进行(方法/变量)调用.也就是,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问. ...
- C++面向对象设计
一. 组合(复合),继承,委托 1.composition(组合)has-a 1.1 组合举例:(Adapter 设计模式) 关系: 利用deque功能实现所有queue功能 template < ...
- tachyon 初识
一.简介 Tachyon是一个高容错的分布式文件系统,允许文件以内存的速度在集群框架中进行可靠的共享,就像Spark和MapReduce那样.通过利用信息继承,内存侵入,Tachyon获得了高性能.T ...