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中,数组长度大 ...
随机推荐
- bzoj 2209 [Jsoi2011]括号序列 平衡树
2209: [Jsoi2011]括号序列 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1404 Solved: 699[Submit][Statu ...
- Maven json包找不到解决办法
在Maven中央仓库找到Maven的jar <dependency> <groupId>net.sf.json-lib</groupId> <artifact ...
- 剑指offer 第一个只出现一次的字符 hash
思路:i表示字符的ASCII码值,cntp[i]表示字符出现的次数. AC代码 class Solution { public: int FirstNotRepeatingChar(string st ...
- Oracle 11g数据库安装和卸载教程
Oracle11g的安装教程 同时解压缩两个zip文件,生成一个database文件夹,进入到database文件夹,点击setup 去掉安全更新的选项,直接下一步 选择创建和配置数据库,点击下一步 ...
- 网络基础tcp/ip协议四
网络层的功能: 定义了基于ip协议的逻辑地址. 链接不同的媒介类型. 选择数据通过网络的最佳路劲. 数据包格式: 优先级与服务类型(8)位:优先级与服务类型 标识符,标志,段偏移量:这几个字用来对数据 ...
- html input密码显示为*号
<!DOCTYPE html> <html encoding="utf-8"> <head> <style> *{margin:0; ...
- 5.3 存储器、I/O和配置读写请求TLP
本节讲述PCIe总线定义的各类TLP,并详细介绍这些TLP的格式.在这些TLP中,有些格式对于初学者来说较难理解.读者需要建立PCIe总线中与TLP相关的一些基本概念,特别是存储器读写相关的报文格式. ...
- android WebP解析开源库-支持高清无损
在我们的项目中需要支持WebP高清无损图片,推荐一个我们已经使用的解析开源库给大家:https://github.com/keshuangjie/WebpExample/tree/master/lib ...
- R︱Rstudio 1.0版本尝鲜(R notebook、下载链接、sparkR、代码时间测试profile)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 2016年11月1日,RStudio 1.0版 ...
- Android视频播放的两种方式介绍
1.在Android 中播放视频的方式有两种: 第一种方式是使用MediaPlayer 结合SurfaceView 来播放,通过MediaPlayer来控制视频的播放.暂停.进度等: 通过Surfac ...