//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. java程序员理解js中的闭包

    1.闭包概念: 就是函数内部通过某种方式访问一个函数内部的局部变量 再次理解: 闭包产生原因: 1.内部函数引用了外部函数的变量 作用:延长局部变量的生命周期 让函数外部可以调用到函数内部的数据 利用 ...

  2. mysql存储引擎、事务

    MySQL存储引擎介绍 文件系统 操作系统组织和存取数据的一种机制. 文件系统是一种软件. 文件系统类型 ext2  ext3  ext4  xfs 数据 不管使用什么文件系统,数据内容不会变化 不同 ...

  3. 关于HTTP,你知道哪些?

    HTTP简介 HTTP 的全称是 Hypertext Transfer Protocol,超文本传输协议 规定客户端和服务器之间的数据传输格式 让客户端和服务器能有效地进行数据沟通 HTTP 协议是网 ...

  4. 如何使用 window api 转换字符集?

    //宽字符转多字节 std::string W2A(const std::wstring& utf8) { int buffSize = WideCharToMultiByte(CP_ACP, ...

  5. ThinkPad W500 清灰记录

    转载请注明出处:HateMath归来(http://www.cnblogs.com/hatemath/) 看型号就知道,这是一台英雄迟暮型的老电脑.到了夏天,启动后啥事不做,通风口都烫手.心情好,一时 ...

  6. Caffe可视化之VisualDL

    Visual DL是由 PaddlePaddle 和 ECharts 合作推出的一款深度学习可视化工具,其能够可视化scalar.参数分布.模型结构.图像等.底层采用C++编写,上层SDK以pytho ...

  7. Spark第一个应用程序

    首先要对源码进行编译,生成对应hadoop版本的spark开发程序jar包,上篇已经写了具体的过程,这里不再赘述. 在安装spark的机器上,下载eclipse-java-x86_64版本,将spar ...

  8. React是什么,为什么要使用它?

    React是Facrbook内部的一个JavaScript类库,已于1年开源,可用于创建Web用户交互界面.它引入了一种新的方式来处理浏览器DOM.那些需要手动更新DOM.费力地记录每一个状态的日子一 ...

  9. NLP+语义分析(四)︱中文语义分析研究现状(CIPS2016、角色标注、篇章分析)

    摘录自:CIPS2016 中文信息处理报告<第二章 语义分析研究进展. 现状及趋势>P14 CIPS2016> 中文信息处理报告下载链接:http://cips-upload.bj. ...

  10. Linux PCI/PCI-E设备配置空间读取与修改

    Linux PCI/PCI-E设备配置空间读取与修改 1 前言 PCI和PCI Express,是计算机常使用的一种高速总线.操作系统中的PCI/PCI-E设备驱动以及操作系统内核,都需要访问PCI及 ...