//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. 测试同学难道要写一辈子的hello world?

    最近我们在测试团队内推行自动化用例责任制,大致的意思是:我们安排培训资源,提供技术支持和一对一辅导,要求每一个自主选择了自动化和接口测试发展通道的同学必须让自己负责的项目自动化用例覆盖率有所提升. 后 ...

  2. C#中引用变量是否应该加ref?

    看如下代码:   void Test(T t); void Test(ref T t); 当T是值类型的时候,很好判断,第一种并不能改变方法外变量的值,需要第二种方法才可以.通过查看IL代码,可以看到 ...

  3. CentOS 7.3 minimal 开启网络服务

    CentOS7解决不能上网问题 1.先进入控制台 输入ip addr 2.然后su 获取超级管理员权限 3.编辑网络配置文件 vi  /etc/sysonfig/network-scripts/ifc ...

  4. Java--JDBC连接与Django--DATABASES设置

    JDBC 简介 JDBC(Java Data Base Connectivity,java 数据库连接)是一种用于执行 SQL 语句的 JavaAPI,可以为多种关系 数据库提供统一访问,它由一组用 ...

  5. Jetty添加Filter过滤器

    1.Jetty嵌入到Spring项目 try { Server server = new Server(8080); WebAppContext context = new WebAppContext ...

  6. WPF将RGB转为HSL的工具类

    class HSLColor     {         private int _alpha = 255;         public int _hue = 0;         public d ...

  7. vue之render基本书写方法

    Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更接 ...

  8. 约瑟夫环-循环队列算法(曾微软,google笔试题)

    这也是我们聚会时常常做的游戏之一. 算法思路: 此处我使用循环链表模拟人围城一圈,每一个结点代表一个人.链表是一个有序链表,链表结点数据域是一个整型,代表人的序号.出局等同于链表删除元素,每次出局后重 ...

  9. 【前端】HTML中最适合做按钮的元素

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/6405914.html 可选的可以做按钮的元素有如下几个 a.input.button.div(span等) 场景 ...

  10. 二、Mysql(二)

    原文参考:http://www.cnblogs.com/wupeiqi/articles/5713323.html 还有一个是课件,看着也像博客,但不知道是谁的 内置函数 触发器 存储过程 索引 与p ...