//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. iOS原生和H5的相互调用

    为什么现在越来越多的APP中开始出现H5页面? 1,H5页面开发效率更高,更改更加方便: 2,适当缩小APP安装包的大小: 3,蹭热点更加方便,比如五一,十一,双十一搞活动: 那么为什么说H5无法取代 ...

  2. Redis的两种持久化方式-快照持久化和AOF持久化

    Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边,数据保存到硬盘的过程就称为"持久化"效 ...

  3. HttpClient读取数据乱码的解决方案

    博主是一个近十年的老书虫了,从高中那会儿就开始看网络小说.每天半天看晚上看啊,终于眼睛也近视了,成绩也下降了(....好像说远了) 最近在追辰东的<圣墟>,最近写到精彩部分了,一直等更新. ...

  4. 理解Activity.runOnUiThread()

    这是一篇译文(中英对照),原文链接:Understanding Activity.runOnUiThread() When developing Android applications we alw ...

  5. MongoDB的DBREF 使用.

    首先要记一下根据 DBREF 的ObjectId 以及根据 ref 集合为条件查询问题. 在不同的可视化客户端里面显示的问题. //某客户端显示这样,直接CMD查询也是这样显示.这样我无法看懂find ...

  6. Wireshark抓包常见出现错误

    转自这里 1.   tcp out-of-order(tcp有问题) 解答: 1).    应该有很多原因.但是多半是网络拥塞,导致顺序包抵达时间不同,延时太长,或者包丢失,需要重新组合数据单元 因为 ...

  7. R实战 第三篇:数据处理(基础)

    数据结构用于存储数据,不同的数据结构对应不同的操作方法,对应不同的分析目的,应选择合适的数据结构.在处理数据时,为了便于检查数据对象,可以通过函数attributes(x)来查看数据对象的属性,str ...

  8. spring中自定义Event事件的使用和浅析

    在我目前接触的项目中,用到了许多spring相关的技术,框架层面的spring.spring mvc就不说了,细节上的功能也用了不少,如schedule定时任务.Filter过滤器. intercep ...

  9. 【转载】SDL2.0在mfc窗口中显示yuv的一种方法

    DWORD ThreadFun(){    //用mfc窗口句柄创建一个sdl window    SDL_Window * pWindow = SDL_CreateWindowFrom( (void ...

  10. BIOS简介

    BIOS简介: BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统".其实,它是一组固化到计 ...