//binary tree
//add order remove find
function tree() {
 var node = function(key) {
  this.left = null;
  this.right = null;
  this.key = key;
 };
 var root = null;
 var insertnode = function(node, newnode) {
  if(node.key > newnode.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);
   }

}

}
 var mildletreenode = function(node, callback) {
  if(node !== null) {
   mildletreenode(node.left, callback);
   callback(node.key);
   mildletreenode(node.right, callback);
  }
 }
 var beforetreenode = function(node, callback) {
  if(node !== null) {
   callback(node.key);
   beforetreenode(node.left, callback);
   beforetreenode(node.right, callback);
  }
 }
 var aftertreenode = function(node, callback) {
  if(node !== null) {
   aftertreenode(node.left, callback);
   aftertreenode(node.right, callback);
   callback(node.key);
  }
 }
 var minnode = function(node) {
  if(node) {
   while(node.left != null) {
    node = node.left;
   }
   return node.key;
  }
 }
 var maxnode = function(node) {
  if(node) {
   while(node.right != null) {
    node = node.right;
   }
   return node.key;
  }
 }
 var findnode = function(node, aim) {
  if(node === null) {
   return false;
  }
  if(node.key < aim) {
   return findnode(node.right, aim);
  } else if(node.key > aim) {
   return findnode(node.left, aim);
  } else {
   return true;
  }
 }
 var findaimnode = function(node) {
  if(node) {
   while(node.left != null) {
    node = node.left;
   }
   return node;
  }
 }
 var removenode = function(node, aim) {
  if(node === null) {
   return null;
  }
  if(node.key > aim) {
   node.left = removenode(node.left, aim);
   return node;
  } else if(node.key < aim) {
   node.right = removenode(node.right, aim);
   return node;
  } else {
   if(node.left === null && node.right === null) {
    node = null;
    return node;
   } else if(node.left !== null && node.right === null) {
    node = node.left;
    return node;
   } else if(node.left === null && node.right !== null) {
    node = node.right;
    return node;
   } else {
    var taimnode = findaimnode(node.right);
    node.key = taimnode.key;
    node.right = removenode(node.right, taimnode.key);
    return node;
   }

}
 }
 var addnode = function(node, newnode) {
  if(node.key > newnode.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.insert = function(key) {
  var newnode = new node(key);
  if(root === null) {
   root = newnode;
  } else {
   insertnode(root, newnode);
  }
 };
 this.mildletree = function(callback) {
  mildletreenode(root, callback);
 }
 this.beforetree = function(callback) {
  beforetreenode(root, callback);
 }
 this.aftertree = function(callback) {
  aftertreenode(root, callback);
 }
 this.min = function() {
  return minnode(root);
 }
 this.max = function() {
  return maxnode(root);
 }
 this.find = function(aim) {
  return findnode(root, aim);
 }
 this.remove = function(aim) {
  return removenode(root, aim);
 }
 this.add = function(key) {
  var newnode = new node(key);
  addnode(root, newnode);
 }
}

function callback(key) {
 console.log(key);
}
//var nodes = [8, 3, 1, 6, 10, 5, 14];
//var thetree = new tree();
//nodes.forEach(function(key) {
// thetree.insert(key);
//})
//thetree.mildletree(callback);
//thetree.beforetree(callback);
//thetree.aftertree(callback);
//alert(thetree.max());
//alert(thetree.min());
//alert(thetree.find(4));
//thetree.remove(14);
//thetree.mildletree(callback);
//thetree.add(4);
//thetree.mildletree(callback)

js实现二叉树的更多相关文章

  1. 实现js的二叉树

    今天算是第一次写一篇自己的博客,越是学习就越感叹学无止境,为了记录下来用js实现二叉树的方法,这算是最简单的一个算法了. 二叉树实现原理:把数组的第一个数据当作根节点,每个节点都有根节点,左孩子和右孩 ...

  2. js 实现二叉树

    二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree),右边的总是大于左边的!二叉树的每个结点至多只有二棵子树(不存 ...

  3. jS生成二叉树,二叉树的遍历,查找以及插入

    js递归,二叉树的操作 //递归算法n次幂 function foo(n) { if (n == 1) { return 1; } else { return n * foo(n - 1); } } ...

  4. JS实现二叉树的创建和遍历

    1.先说二叉树的遍历,遍历方式: 前序遍历:先遍历根结点,然后左子树,再右子树 中序遍历:先遍历左子树,然后根结点,再右子树 后续遍历:先遍历左子树,然后右子树,再根结点   上代码:主要还是利用递归 ...

  5. 排序图解:js排序算法实现

    之前写过js实现数组去重, 今天继续研究数组: 排序算法实现. 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. ...

  6. js算法-快速排序(Quicksort)

    快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出.在平均状况下,排序n个项目要O(nLogn)次比 ...

  7. 【js数据结构】可逐次添加叶子的二叉树(非最优二叉树)

    最近小菜鸟西瓜莹看到了一道面试题: 给定二叉树,按层打印.例如1的子节点是2.3, 2的子节点是3.4, 5的子节点是6,7. 需要建立如图二叉树: 但是西瓜莹找到的相关代码都是用js构建最优二叉树, ...

  8. javascript/js实现 排序二叉树数据结构 学习随笔

    二叉树是一种数据结构.其特点是: 1.由一系列节点组成,具有层级结构.每个节点的特性包含有节点值.关系指针.节点之间存在对应关系. 2.树中存在一个没有父节点的节点,叫做根节点.树的末尾存在一系列没有 ...

  9. 用js刷剑指offer(二叉树中和为某一值的路径)

    题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...

随机推荐

  1. js创建数组的三个方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 老男孩Python全栈开发(92天全)视频教程 自学笔记16

    day16课程内容: 装饰器: def outer(): x=10 def inner(): print(x) return innerouter()() #inner 是局部变量,10闭包:如果在一 ...

  3. 网卡驱动引起openstack的mtu问题

    一套Pike版本的openstack测试环境,使用vlan模式的网络,数据网网卡使用的是绿联的usb百兆网卡,遇到了虚拟机网络异常的问题.同一个vlan下,不同宿主机上的两台虚拟机,相互之间可以pin ...

  4. Luogu P1690 贪婪的Copy

    题目描述 Copy从卢牛那里听说在一片叫yz的神的领域埋藏着不少宝藏,于是Copy来到了这个被划分为个区域的神地.卢牛告诉了Copy这里共有个宝藏,分别放在第Pi个(1<=Pi<=N)区域 ...

  5. iOS.Animations.by.Tutorials.v2.0汉化(四)

    第三章 转换 在前面的两章,你学习了如何创建基于视图位置和透明度alpha的动画属性的动画.但是,如果您希望在视图上添加动画或删除动画,您将如何处理呢? 您可以使用前几章的方法来设置进出界面的动画效果 ...

  6. python︱函数、for、_name_杂记

    新手入门python,开始写一些简单函数,慢慢来,加油~ 一.函数 def myadd(a=1,b=100): result = 0 i = a while i <= b: # 默认值为1+2+ ...

  7. Ubuntu 11.04安装arm-linux-gcc-4.4.3/arm-none-linux-gnueabi-gcc安装包

    准备工具和系统 arm-linux-gcc-4.4.3.tar.gz arm-linux-gcc-4.4.3下载地址: 下载在Linux公社的1号FTP服务器里,下载地址: FTP地址:ftp://w ...

  8. Java获取某年某月的第一天

    Java获取某年某月的第一天 1.设计源码 FisrtDayOfMonth.java: /** * @Title:FisrtDayOfMonth.java * @Package:com.you.fre ...

  9. 使用vue-cli脚手架初始化Vue项目下的项目结构

    概述 vue-cli是Vue 提供的一个官方命令行工具,可用于快速搭建大型单页应用.该工具提供开箱即用的构建工具配置,带来现代化的前端开发流程.只需几分钟即可创建并启动一个带热重载.保存时静态检查以及 ...

  10. 芝麻HTTP:Gerapy的安装

    Gerapy是一个Scrapy分布式管理模块,本节就来介绍一下它的安装方式. 1. 相关链接 GitHub:https://github.com/Gerapy 2. pip安装 这里推荐使用pip安装 ...