js实现二叉树
//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实现二叉树的更多相关文章
- 实现js的二叉树
今天算是第一次写一篇自己的博客,越是学习就越感叹学无止境,为了记录下来用js实现二叉树的方法,这算是最简单的一个算法了. 二叉树实现原理:把数组的第一个数据当作根节点,每个节点都有根节点,左孩子和右孩 ...
- js 实现二叉树
二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree),右边的总是大于左边的!二叉树的每个结点至多只有二棵子树(不存 ...
- jS生成二叉树,二叉树的遍历,查找以及插入
js递归,二叉树的操作 //递归算法n次幂 function foo(n) { if (n == 1) { return 1; } else { return n * foo(n - 1); } } ...
- JS实现二叉树的创建和遍历
1.先说二叉树的遍历,遍历方式: 前序遍历:先遍历根结点,然后左子树,再右子树 中序遍历:先遍历左子树,然后根结点,再右子树 后续遍历:先遍历左子树,然后右子树,再根结点 上代码:主要还是利用递归 ...
- 排序图解:js排序算法实现
之前写过js实现数组去重, 今天继续研究数组: 排序算法实现. 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. ...
- js算法-快速排序(Quicksort)
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出.在平均状况下,排序n个项目要O(nLogn)次比 ...
- 【js数据结构】可逐次添加叶子的二叉树(非最优二叉树)
最近小菜鸟西瓜莹看到了一道面试题: 给定二叉树,按层打印.例如1的子节点是2.3, 2的子节点是3.4, 5的子节点是6,7. 需要建立如图二叉树: 但是西瓜莹找到的相关代码都是用js构建最优二叉树, ...
- javascript/js实现 排序二叉树数据结构 学习随笔
二叉树是一种数据结构.其特点是: 1.由一系列节点组成,具有层级结构.每个节点的特性包含有节点值.关系指针.节点之间存在对应关系. 2.树中存在一个没有父节点的节点,叫做根节点.树的末尾存在一系列没有 ...
- 用js刷剑指offer(二叉树中和为某一值的路径)
题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...
随机推荐
- 登录功能(MD5加密)
登录这个功能,是不管哪个项目都会用到的,登录做的好坏,安全性的保障将直接影响到整个系统的成败,尤其是一些安全性要求比较严格的项目 1.首先需要对密码进行加密,这里用到的是md5加密,需要在login. ...
- mysql3 - 常规数据检索、常见操作与函数
一.常规数据检索 二.常见操作与函数
- Mysql的sql_mode
(一) 基本介绍 set sql_mode="",即强制不设定MySql模式(如不作输入检测.错误提示.语法模式检查等)应该能提高性能,但有如下问题: 如果插入了不合适数据(错误类 ...
- POJ - 1190 生日蛋糕 dfs+剪枝
思路:说一下最重要的剪枝,如果当前已经使用了v的体积,为了让剩下的表面积最小,最好的办法就是让R尽量大,因为V = πR 2H,A' = 2πRH,A' = V / R * 2 ,最大的R一定是取当前 ...
- JavaScript原生拖放API入门总结
一.背景 最早实现JavaScript拖放功能的是IE4的浏览器了.在当时,网页中只有图像和文本才能够进行拖放.IE5之后,拖放功能得到了扩展,形成了一个API(应用程序编程接口),使得几乎任何的标签 ...
- SQL Server 批量插入
使用场景 在项目中,涉及到数据库表变更时,可能会需要将一个或多个表中的数据迁移到另一个表中. 这时用sql去执行会很方便! sql语句 //SQL批量插入 create table #ttableNa ...
- 火狐浏览器导出EXCEL 表格,文件名乱码问题
牢骚:今天又是一个不太平的日子,打开任务表一看里面有一堆bug,其中有一个就是今天要说的这个关于商品导出的问题,本功能是临时授命接一个任务,本来呢这个导出功能在系统各大模块已经都很成熟了,但是总有一个 ...
- tensorflow+入门笔记︱基本张量tensor理解与tensorflow运行结构
Gokula Krishnan Santhanam认为,大部分深度学习框架都包含以下五个核心组件: 张量(Tensor) 基于张量的各种操作 计算图(Computation Graph) 自动微分(A ...
- GJB150-2009军用装备实验室环境试验方法新版标准
http://www.kekaoxing.com/m/view.php?aid=22604 GJB150.1A-2009 军用装备实验室环境试验方法第1部分:通用要求(代替GJB150.1-86)GJ ...
- freemarker报错之七
1.错误描述 五月 30, 2014 11:33:57 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...