function BinarySearchTree(){
var cnodes = function(key){
this.key = key;
this.left = null;
this.right = null;
} var root = null; this.insert = function(key){
var nodes = new cnodes(key);
if(root === null){
root = nodes;
}else{
insertNode(root,nodes);
}
} function insertNode(rnode,newnode){
if(newnode.key < rnode.key){
if(rnode.left === null){
rnode.left = newnode;
}else{
insertNode(rnode.left,newnode);
}
}else{
if(rnode.right === null){
rnode.right = newnode;
}else{
insertNode(rnode.right , newnode );
}
}
} //中序遍历
this.inOrderTraverse = function(callback){
inOrderTraverseNode(root, callback);
};
function inOrderTraverseNode(cnode,callback){
if(cnode !== null){
inOrderTraverseNode(cnode.left,callback );
callback(cnode.key);
inOrderTraverseNode(cnode.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(callback){
postOrderTraverseNode(root, callback);
};
function postOrderTraverseNode(cnode, callback){
if(cnode !== null){
postOrderTraverseNode(cnode.left, callback);
postOrderTraverseNode(cnode.right, callback);
callback(cnode.key);
}
} //搜索最小值
this.min = function(){
return minNode(root);
}; function minNode(cnode){
if(cnode){
while(cnode && cnode.left !== null){
cnode = cnode.left;
}
return cnode.key;
}
return null;
} this.max = function(){
return maxNode(root);
}
function maxNode(cnode){
if(cnode){
while(cnode && cnode.right !== null){
cnode = cnode.right;
}
return cnode.key;
}
return null;
} this.search = function(key){
return searchNode(root,key);
}; function searchNode(cnode,key){
if(cnode === null){
return false;
} if(key < cnode.key){
return searchNode(cnode.left,key);
}else if(key > cnode.key){
return searchNode(cnode.right,key);
}else{
return true;
}
} //删除
this.remove = function(key){
root = removeNode(root,key);
}; function removeNode(cnode,key){
if(cnode == null){
return null;
}
if(key < cnode.key){
cnode.left = removeNode(cnode.left , key);
return cnode;
}else if(key > cnode.key){
cnode.right = removeNode(cnode.right , key);
return cnode;
}else{
//等于的时候
//第一种情况,一个叶节点
if(cnode.left === null && cnode.right === null){
cnode = null;
return cnode;
} //第二种情况,一个子节点
if(cnode.left === null){
cnode = cnode.right;
return cnode;
}else if(cnode.right === null){
cnode = cnode.left;
return cnode;
}
//第三种情况,两个子节点
//1找到要删除的节点
//2找到该节点,右侧子树中的最小节点,替换自己
//3删掉右侧子树中的最小节点
var aux = findMinNode(cnode.right);
cnode.key = aux.key;
cnode.right = removeNode(cnode.right,aux.key);
return cnode;
}
}
var findMinNode = function(node){
//右侧子树中最小节点的键去更新这个节点的值
while (node && node.left !== null) {
node = node.left;
}
return node;
};
} var tree = new BinarySearchTree();
tree.insert(11);
tree.insert(7);
tree.insert(15);
tree.insert(5);
tree.insert(3);
tree.insert(9);
tree.insert(8);
tree.insert(10);
tree.insert(13);
tree.insert(12);
tree.insert(14);
tree.insert(20);
tree.insert(18);
tree.insert(25);
tree.insert(6); tree.inOrderTraverse(function(key){
console.log(key);
});
tree.remove(15);
console.log("-----------");
tree.inOrderTraverse(function(key){
console.log(key);
});

  

js树形结构-----(BST)二叉树增删查的更多相关文章

  1. node.js+express+mongoose实现用户增删查改案例

    node.js+express+mongodb对用户进行增删查改 一.用到的相关技术 使用 Node.js 的 express 框架搭建web服务 使用 express 中间件 body-parse ...

  2. JS 树形结构与数组结构相互转换、在树形结构中查找对象

    总是有很多需求是关于处理树形结构的,所以不得不总结几个常见操作的写法.¯\_(ツ)_/¯ 首先假设有一个树形结构数据如下 var tree=[ { 'id': '1', 'name': '教学素材管理 ...

  3. js实现对数据库的增删查改

    1.查询 复制代码 代码如下: <HTML> <HEAD> <TITLE>数据查询</TITLE> <Script > var conn = ...

  4. Java创建树形结构算法实例

    在JavaWeb的相关开发中经常会涉及到多级菜单的展示,为了方便菜单的管理需要使用数据库进行支持,本例采用相关算法讲数据库中的条形记录进行相关组装和排序讲菜单组装成树形结构. 首先是需要的JavaBe ...

  5. node.js+mysql增删查改

    数据库和表: -- -- 数据库: `test` -- -- -------------------------------------------------------- -- -- 表的结构 ` ...

  6. Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结

    Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...

  7. 使用ztree.js,受益一生,十分钟学会使用tree树形结构插件

    看到ztree.js,这几个字眼,毋庸置疑,那肯定就是tree树形结构了,曾经的swing年代有jtree,后来jquery年代有jstree和treeview,虽然我没写过,但是我见过,一些小功能做 ...

  8. CSS实现树形结构 + js加载数据

    看到一款树形结构,比较喜欢它的样式,就参照它的外观自己做了一个,练习一下CSS. 做出来的效果如下: li { position: relative; padding: 5px 0; margin:0 ...

  9. js中数组增删查改unshift、push、pop、shift、slice、indexOf、concat、join

    js中数组增删查改unshift.push.pop.shift.slice.indexOf.concat.join

随机推荐

  1. 网络通信协议八之(传输层)TCP协议详解

    传输层协议 分段是为了提高传输效率,封装是指给每个数据段添加一个编号 端到端的传输是逻辑上的端到端,并不是真正意义上的发送方某层与接收方某层之间的传输 IP协议只是保证数据报文发送到目的地,为主机之间 ...

  2. ThinkPHP框架 表单传值自动验证!!

    如果有多个字段都包含错误,默认只显示一个错误.如果想显示全部错误,可以设置属 性: //批量验证 d protected $patchValidate = true; 如果是直接 POST 过来的,直 ...

  3. 基于cdh5.10.x hadoop版本的apache源码编译安装spark

    参考文档:http://spark.apache.org/docs/1.6.0/building-spark.html spark安装需要选择源码编译方式进行安装部署,cdh5.10.0提供默认的二进 ...

  4. JS之JSON.parse和JSON.stringify

    这两个函数有兼容性问题, 会报错JSON"未定义 解决方案, 引入json2.js,可以解决浏览器的兼容性 https://link.jianshu.com/?t=https://githu ...

  5. PHP-之POSIX系列函数和兼容Perl系列函数比较

    PHP有两种正则系列函数 POSIX 系列和兼容Perl系列的函数 在PHP大于5.3使用POSIX系列函数会报E_DEPRECATED 错误, POSIX系列函数在大于5.3版本不建议使用,PHP7 ...

  6. [about remote controller]--mstsc-teamviewer-vnc,nomachine

    https://www.jianshu.com/p/c80db368ed8a https://www.nomachine.com/download Ubuntu安装VNC,VNC却无法随系统启动,遂换 ...

  7. 类中的函数带有self,不带self的区别

    1.类里函数不带self,这是我们调用类里的函数直接用类名.函数名() class shop(object): def scan_goods(): #括号内不带self print('浏览商品') d ...

  8. H2O 笔记之安装

    参考资料: 了解H2O:http://h2o-release.s3.amazonaws.com/h2o/rel-turchin/9/docs-website/h2o-docs/index.html 安 ...

  9. git知识点

    先说几个名词 未被追踪的文件:指的是新建的文件或文件夹且还没加入到暂存区(新建的还没有被git add 过得) 未加入到暂存区的文件:指的是已经被追踪过,但是没有加入到暂存区(已经执行过git add ...

  10. ORACLE UNDO

    UNDO 数据操纵 数据操纵语言(DML)由以下SQL语句组成: INSERT,DELETE,UPDATE,MERGE DML始终作为事务处理的一部分执行,它可以: 使用Rollback命令执行回退 ...