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数据结构与算法——二叉树的更多相关文章

  1. JS数据结构与算法 - 二叉树(一)基本算法

    仅供JavaScript刷题参考用. 二叉查找树和平衡二叉树 其它树:满二叉树.完全二叉树.完美二叉树.哈弗曼树.二叉查找树BST.平衡二叉树AVL 了解:红黑树,是一种特殊的二叉树.这种树可以进行高 ...

  2. javascript数据结构与算法-- 二叉树

    javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...

  3. javascript数据结构与算法---二叉树(删除节点)

    javascript数据结构与算法---二叉树(删除节点) function Node(data,left,right) { this.data = data; this.left = left; t ...

  4. javascript数据结构与算法---二叉树(查找最小值、最大值、给定值)

    javascript数据结构与算法---二叉树(查找最小值.最大值.给定值) function Node(data,left,right) { this.data = data; this.left ...

  5. javascript数据结构与算法--二叉树遍历(后序)

    javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...

  6. javascript数据结构与算法--二叉树遍历(先序)

    javascript数据结构与算法--二叉树遍历(先序) 先序遍历先访问根节点, 然后以同样方式访问左子树和右子树 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...

  7. javascript数据结构与算法--二叉树遍历(中序)

    javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...

  8. JS数据结构与算法——栈

    JS数据结构与算法--栈 1.栈结构概念 栈(Stack)是一种先进后出(LIFO Last in First out)的线性表,先进栈的将会比后进栈的先出栈. 栈的限制是仅允许在一端进行插入和删除运 ...

  9. JS数据结构与算法-概述

    JS数据结构与算法概述 数据结构: 计算机存储, 组织数据的方式, 就像锅碗瓢盆 算法: 一系列解决问题的清晰指令, 就像食谱 两者关系: 程序 = 数据结构 + 算法 邂逅数据结构与算法 什么是数据 ...

随机推荐

  1. gRPC源码分析(c++)

    首先需要按照grpc官网上说的办法从github上下载源码,编译,然后跑一跑对应的测试代码.我分析的代码版本为v1.20.0. 在cpp的helloworld例子中,client端,第一个函数是创建c ...

  2. log4j到log4j2升级迁移方案

    序:这段时间因为维护的项目存在大量日志打印,严重拖慢整体响应时间,在做性能优化的工作中对这块内容进行了升级换代,由以前的log4j升级为log4j2,以实现日志异步打印.接下来记录一下这个费时半个月的 ...

  3. 初学tensorflow遇到的Error——UnrecognizedFlagError: Unknown command line flag 'f'

    最近在学习<tensorflow实战>时需要下载cifar10数据集,在cifar10目录下用到命令: import cifar10,cifar10_inputcifar10.maybe_ ...

  4. bzoj 2002 : [Hnoi2010]Bounce 弹飞绵羊 (LCT)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 题面: 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: ...

  5. maven私服nexus清理释放磁盘空间

    应用背景: 自建的maven私服(或者叫私仓)nexus在使用过程中,因很多服务不断迭代更新上传jar包至nexus中,底层存放在一个叫Blob Stores的存储中,最近发现该存储已增大至好几百G, ...

  6. Docke--Dockerfile实践

    Dockerfile 实践 nginx镜像构建 先查看下本地的镜像,选取官网的centos作为base image: [root@server ~]# docker images REPOSITORY ...

  7. 3d

    http://jokerwang.com/diy-3d%E6%89%93%E5%8D%B0%E6%9C%BA1-%E7%A1%AC%E4%BB%B6%E7%AF%87/

  8. Tomcat 配置文件 server.xml

    Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛.server.xml是Tomcat中最重要的配置文件,server.xml的每一个元素都对应了Tomcat中的一个组 ...

  9. 第三篇--创建.gitignore文件

    小知识 ·  git add -A  提交所有变化 ·  git add -u  提交被修改(modified)和被删除(deleted)文件,不包括新文件(new) ·  git add .  提交 ...

  10. linux 下查看java进程

    linux下查看出问题的java进程,便于发现程序问题.命令如下: 找到存在问题的java进程号,ps -ef|grep java ,如进程30021 卡住,需要查看该进程信息,那么敲入命令: jst ...