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中可以看到 点击查看,可以 ...
随机推荐
- QT程序在windows下部署发布
转载:http://www.cnblogs.com/Fan_Fan/archive/2010/05/29/1746860.html QT程序在windows下部署发布 以下包括了部分网上收集的,以及q ...
- 除去字符串中不相临的重复的字符 aabcad 得 aabcd
假设有一个字符串aabcad,请编写一段程序,去掉字符串中不相邻的重复字符.即上述字串处理之后结果是为:aabcd; 分析,重点考查 char 与int 的隐式转换.程序如下: static void ...
- Robot Framework简介
概述 Robot Framework是一个通用的关键字驱动自动化测试框架.测试用例以HTML,纯文本或TSV(制表符分隔的一系列值)文件存储. 通过测试库中实现的关键字驱动被测软件.Robot Fra ...
- Spring SqlRowSet example--转载
原文地址:http://www.roseindia.net/tutorial/spring/spring3/jdbc/sqlrowset.html The 'SqlRowSet' is used to ...
- DNS服务器全面解析--转
引用地址:http://pangge.blog.51cto.com/6013757/1273087 基础认知篇 DNS服务的概述 DNS是Domain Name System 的缩写,即域名系统.DN ...
- CSRF 攻击的应对之道--转
http://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/ 简介: CSRF(Cross Site Request Forgery, 跨站域 ...
- LeetCode45 Jump Game II
题目: Given an array of non-negative integers, you are initially positioned at the first index of the ...
- ios - 带动画圆形旋转的进度条
#import <UIKit/UIKit.h> @interface TJCircleProgressView : UIView /** * 图标 */ @property(nonatom ...
- 【Android车载系统 News | Tech 1】News 谷歌开发车载Android系统 2014-12-19
据外国媒体报道,Android和iOS两大操作系统在垄断手机和平板之后,开始向智能家居.智能汽车.客厅娱乐.物联网等领域扩张.谷歌和苹果此 前均推出了连接智能手机和车载信息系统的平台产品.2014年1 ...
- 【开源项目3】Android快速开源框架--afinal
Afinal简介 Afinal 是一个android的sqlite orm 和 ioc 框架.同时封装了android中的http框架,使其更加简单易用: 使用finalBitmap,无需考虑bitm ...