js数据结构与算法——二叉树
function BinaryTree(){
var Node = function(key){
this.key = key; //值
this.left = null; //左箭头
this.right = null; //右箭头
}
//根节点
var root = null;
var insertNode = function(oldNode,newNode){
if(newNode.key < oldNode.key){
if(oldNode.left === null){
oldNode.left = newNode
}else{
insertNode(oldNode.left,newNode)//递归查找
}
}else{
if(oldNode.right === null){
oldNode.right = newNode
}else{
insertNode(oldNode.right,newNode);
}
}
}
//插入节点
this.insert = function(key) {
var newNode = new Node(key);
if(root === null){
root = newNode;
}else{
insertNode(root,newNode)
}
}
//中序排列
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 = (node,callback)=>{
if(node !== null){
callback(node.key);
preOrderTraverseNode(node.left,callback);
preOrderTraverseNode(node.right,callback);
}
}
//后序遍历,先访问节点的后代节点,再访问节点本身
this.postOrderTraverse = function(callback){
postOrderTraverseNode(root,callback);
}
var postOrderTraverseNode = (node,callback) =>{
if(node !== null){
postOrderTraverseNode(node.left,callback);
postOrderTraverseNode(node.right,callback);
callback(node.key);
}
}
//搜索最大值,最小值
this.min = function(){
return minNode(root);
}
var minNode = (node)=>{
if(node){
while(node && node.left !== null){
node = node.left;
}
return node.key
}
return null;
}
this.max = function(){
return maxNode(root);
}
var maxNode = (node) => {
if(node){
while(node && node.right !== null){
node = node.right;
}
return node.key
}
return null;
}
//搜索一个特定的值
this.search = function(key){
return searchNode(root,key);
}
var searchNode = (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;
}
}
//移除一个节点
this.remove = function(key){
return removeNode(root,key);
}
var removeNode = (node,key) =>{
if(node === null){
return false
}
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{
//第一种情况 一个叶子节点
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 = (node)=>{
if(node){
while(node && node.left !== null){
node = node.left;
}
return node
}
return null;
}
}
let node = [8,3,10,1,6,14,4,7,13];
var binaryTree = new BinaryTree();
node.forEach((key)=>{
binaryTree.insert(key);
})
var printNode = (val) => {
console.log(val)
}
binaryTree.inOrderTraverse(printNode) //中序遍历
binaryTree.preOrderTraverse(printNode) //先序遍历
binaryTree.postOrderTraverse(printNode) //后序遍历
console.log(binaryTree.min() + ': min')
console.log(binaryTree.max() + ': max')
console.log(binaryTree.search(8) + ': search')
console.log(binaryTree.remove(8) )
js数据结构与算法——二叉树的更多相关文章
- JS数据结构与算法 - 二叉树(一)基本算法
仅供JavaScript刷题参考用. 二叉查找树和平衡二叉树 其它树:满二叉树.完全二叉树.完美二叉树.哈弗曼树.二叉查找树BST.平衡二叉树AVL 了解:红黑树,是一种特殊的二叉树.这种树可以进行高 ...
- javascript数据结构与算法-- 二叉树
javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...
- javascript数据结构与算法---二叉树(删除节点)
javascript数据结构与算法---二叉树(删除节点) function Node(data,left,right) { this.data = data; this.left = left; t ...
- javascript数据结构与算法---二叉树(查找最小值、最大值、给定值)
javascript数据结构与算法---二叉树(查找最小值.最大值.给定值) function Node(data,left,right) { this.data = data; this.left ...
- javascript数据结构与算法--二叉树遍历(后序)
javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...
- javascript数据结构与算法--二叉树遍历(先序)
javascript数据结构与算法--二叉树遍历(先序) 先序遍历先访问根节点, 然后以同样方式访问左子树和右子树 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
- javascript数据结构与算法--二叉树遍历(中序)
javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
- JS数据结构与算法——栈
JS数据结构与算法--栈 1.栈结构概念 栈(Stack)是一种先进后出(LIFO Last in First out)的线性表,先进栈的将会比后进栈的先出栈. 栈的限制是仅允许在一端进行插入和删除运 ...
- JS数据结构与算法-概述
JS数据结构与算法概述 数据结构: 计算机存储, 组织数据的方式, 就像锅碗瓢盆 算法: 一系列解决问题的清晰指令, 就像食谱 两者关系: 程序 = 数据结构 + 算法 邂逅数据结构与算法 什么是数据 ...
随机推荐
- VUE如何实现切换页面时的过渡动画?
最近再写页面的时候,感觉页面之间的切换有点生硬,所以查了一下文档看见了transition这个组建,很实用,故此在这里跟大家分享一下 --------------------------------- ...
- Bitmap的使用习惯——及时释放Bitmap占用的内存
当Bitmap不再需要使用时,我们应该回收它占用的内存,如果我们直接把指向bitmap的引用置null的话,这样bitmap还是会存在内存中,直到GC机制起作用时,才可能会把这个bitmap回收.这样 ...
- miui 系统铃声
MIUI7-8系统铃声和通知铃声等,从miui system.img中提取出来的: 链接:http://pan.baidu.com/s/1bpH5N5P 密码:tz7p
- 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】
题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...
- Java复习总结——继承
访问权限 Java中有三个访问权限修饰符:private.protected以及public,如果不加访问修饰符,表示包级可见. 可以对类或类中的成员(字段以及方法)加上访问修饰符. 类可见表示其他类 ...
- mysql 数据库表迁移复制
1. 表结构相同的表,且在同一数据库(如,table1,table2) insert into table1 select * from table2 # 完全复制 insert into table ...
- Python菜鸟快乐游戏编程_pygame(2)
Python菜鸟快乐游戏编程_pygame(博主录制,2K分辨率,超高清) https://study.163.com/course/courseMain.htm?courseId=100618802 ...
- SpringCloud笔记七:Zuul
目录 什么是Zull 为什么需要Zuul 新建Zuul项目 运行Zuul Zuul的基本配置 忽略微服务的真实名称 设置统一公共前缀 总结 什么是Zull Zuul就是一个网关,实现的功能:代理.路由 ...
- Tomcat系列(2)——Tomcat文件目录7个
核心部分 bin (运行脚本) conf (配置文件) lib (核心库文件) logs (日志目录) temp (临时目录) webapps (自动装载的应用程序的目录) work (JVM临时文件 ...
- (Python)PO设计模式
无规矩不成方圆.编写代码也是,如果没有大概的框架,管理代码将会是一件很头疼的事. 先看看笔者以前写的python脚本: 如果只有一个用例,这样看着好像挺整洁的.但是当用例越来越多后,如果元素定位发生了 ...