function BinarySearchTree(){var Node = function(key){this.key = key;this.left = null;this.right = null;};var root = null;   //根元素//在树中插入一个新的键this.insert = function(key){//创建用来表示新节点的Node实例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方法继续找到树的下一层insertNode(node.left, newNode);}}else{//如果节点的键比当前节点的键大,同时当前节点没有右侧子节点,就在那里插入新的节点if(node.right === null){node.right = newNode;}else{//如果又右侧子节点,递归调用insetNode方法insertNode(node.right,newNode);}}};//中序遍历所有节点//接受一个回调函数作为参数this.inOrderTraverse = function(callback){inOrderTraverseNode(root,callback);};var inOrderTraverseNode = function(node,callback){//检查以参数形式传入的节点是否为nullif(node !== null){//递归调用相同的函数来访问左侧子节点,对这个节点进行一些操作(callback)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(callback){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 = nnode.left;}return node.key;}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;}return null;};//声明search方法this.search = function(key){return searchNode(root,key);};var searchNode = function(node,key){//验证作为参数传入的node是否合法(不是null)如果是null,返回falseif(node===null){return false;}//要找的键比当前节点小,继续在左侧子树上搜索。要找的键比当前的节点哒,从右侧子节点开始搜索if(key<node.key){return searchNode(node.left,key);}else if(key>node.key){return searchNode(node.right,key);}else{//要找的键和当前节点的键相等,返回truereturn true;}};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{//找到了要找的键,处理3种不同情况//1.移除一个叶节点if(node.left ===null&&node.right ===null){node = null;return null;}//2.移除有一个左侧或右侧子节点的节点if(node.left === null){node = node.right;return node;} else if(node.right ===null){node = node.left;return node;}//3.移除有两个子节点的节点var aux = findMinNode(node.right);node.key = aux.key;node.right = removeNode(node.right,aux.key);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);//创建一个回调函数function printNode(value){console.log(value);}//调用inOrderTraverse方法并将回调函数作为参数传入//tree.inOrderTraverse(printNode);//调用preOrderTraverse//tree.preOrderTraverse(printNode);//调用postOrderTraverse//tree.postOrderTraverse(printNode);console.log(tree.search(1)?'found':'not found');console.log(tree.search(8)?'found':'not found');

JavaScript二叉搜索树相关推荐

  1. javascript实现二叉搜索树

    在使用javascript实现基本的数据结构中,练习了好几周,对基本的数据结构如 栈.队列.链表.集合.哈希表.树.图等内容进行了总结并且写了笔记和代码. 在 github中可以看到  点击查看,可以 ...

  2. JavaScript中的二叉搜索树删除节点代码

    JavaScript中的二叉搜索树删除节点代码 提示:只有删除的节点的操作哦~ 二叉搜索树的删除节点操作: 删除二叉搜索树节点会出现的情况 1.删除的是叶子节点,即其左右均为空节点 2. 删除的是只有 ...

  3. js遍历树节点下的所有子节点_「Javascript数据结构」× 二叉搜索树

    目录 树的相关术语 二叉树和二叉搜索树 二叉树的遍历 二叉搜索树的搜索 二叉搜索树的移除 「 树的相关术语 」 一个树结构包含一些列存在父子关系的节点.每个节点都有一个父节点(除了顶部的第一个节点)以 ...

  4. LeetCode(783)——二叉搜索树结点最小距离(JavaScript)

    给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值. 示例1: 输入: root = [4,2,6,1,3,null,null] 输出: 1 解释: 注意,root是树结点对象(T ...

  5. LeetCode(530)——二叉搜索树的最小绝对差(JavaScript)

    给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值. 示例: 输入: 输出: 1 解释: 最小绝对差为1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3). 注意: 树 ...

  6. ★LeetCode(538)——把二叉搜索树转换为累加树(JavaScript)

    给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和. 示例1: 输入: 二叉搜索树: ...

  7. LeetCode(235)——二叉搜索树的最近公共祖先(JavaScript)

    给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖 ...

  8. ★LeetCode(669)——修剪二叉搜索树(JavaScript)

    给定一个二叉搜索树,同时给定最小边界L 和最大边界 R.通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) .你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根 ...

  9. ★LeetCode(108)——将有序数组转换为二叉搜索树(JavaScript)

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...

最新文章

  1. 如何优雅地展示机器学习项目!
  2. bitnami-redmineserver迁移
  3. vmware中的网络(bridge,nat)(转载)
  4. css实现多行文字溢出隐藏——前端小问题不定时更新
  5. 后台产品经理入门指南(下)
  6. eset14 杀毒清除无提示
  7. python列表、元组、字典和集合的算法时间_27.Python列表(list)、元组(tuple)、字典(dict)和集合(set)详解...
  8. 随笔:写给我深爱的球队
  9. 使用 rqt_console 和 roslaunch
  10. LeetCode 925. 长按键入(双指针)
  11. python time,datetime与highchart中的time
  12. CSDN技术分享——程序员如何快速上手区块链底层技术?
  13. 最牛逼android上的图表库MpChart(二) 折线图
  14. 泛微 - eteams
  15. MacOS Aria2GUI配置
  16. 美国计算机一年制,美国一年制硕士
  17. 51jiqiren小语种语音机器人
  18. 已经更CSS《一篇文章让你从HTML零基础入门前端开发》12.22
  19. 【搞一点AUTOSAR】基于TC397的MACL_ADC配置(Davinci工具链)
  20. 浅谈SSD,eMMC,UFS

热门文章

  1. AbstractAutoWireCapableBeanFactory 对Bean 实例进行属性依赖注入
  2. 体验Lambda表达式【理解】
  3. aop简介-aop相关概念
  4. Spring对于Bean管理的核心组件
  5. TCC事务补偿机制实现分布式事务控制介绍
  6. 使用RSA算法解析令牌
  7. JDK7的六个新特性回顾和讲解
  8. springAMQP
  9. 注册中心解决了什么问题
  10. java properties 属性,java 读取 properties 属性资料