自己尝试用js实现了数据结构的二叉查找树。

// node
function Node(data) {
this.data = data;
this.lc = null;
this.rc = null;
} // BST
function BST() {
this.root = null;
}
//======================create root node======================
BST.prototype.create = function(num) {
this.root = new Node(num);
}
// ======================add tree node=========================
BST.prototype.insert = function(root, num) {
var node = new Node(num); if(root.data < node.data) {
if(!root.rc)
root.rc = node;
else
this.insert(root.rc, num);
} else {
if(!root.lc)
root.lc = node;
else
this.insert(root.lc, num);
}
} var bst = new BST();
var arr = [5,3,6,7,4,1,8]; // create root node
bst.create(arr[0]);
// create tree
for(var i = 1; i < arr.length; i++) {
bst.insert(bst.root, arr[i]);
}

console.log(bst.root);

第二种

// node
function Node(data) {
this.data = data;
this.lc = null;
this.rc = null;
} // BST
function BST() {
this.root = null;
} // add tree node
BST.prototype.insert = function(num, bst) {
var node = new Node(num);
var isRootTree = (bst && bst.hasOwnProperty('root')); // 判断传入的是一棵树还是一个节点
var root = isRootTree ? bst.root : bst; if(isRootTree && !root) { // 如果传入的参数为树且该树的root为null
bst.root = node; // 初始化root,不能用root = node,
// 因为这样不会改变bst.root,而是另root变量重新指向了一个新node节点
} else {
var target = root.data < num ? 'rc' : 'lc'; // 避免bst为null带来的error
root[target] == null ? root[target] = node : this.insert(num, root[target]);
}
}; var bst = new BST();
var arr = [5,9,6,7,4,1,8]; for(var i = 0; i < arr.length; i++) {
bst.insert(arr[i], bst);
}
console.log(bst.root);

第三种  通过迭代

// node
function Node(data) {
this.data = data;
this.left = null;
this.rifht = null;
} // BST
function BST() {
this.root = null;
}
BST.prototype.insert = function(data){
var node = new Node(data, null, null);
if(this.root == null){
this.root = node;
}
else{
var currNode = this.root;
var parent; while(true){
parent = currNode;
if(data < currNode.data){
currNode = currNode.left;
if(currNode == null){
parent.left = node;
break;
}
}
else{
currNode = currNode.right;
if(currNode == null){
parent.right = node;
break;
}
}
}
}
}; BST.prototype.orderVisit = function(root) {
if(root) {
this.orderVisit(root.left);
console.log(root.data);
this.orderVisit(root.right);
}
}; var arr = [5,4,6,3,7,2,8];
var bst = new BST(); for(var i = 0; i < arr.length; i++)
bst.insert(arr[i]); bst.orderVisit(bst.root);

JavaScript之BST的更多相关文章

  1. 数据结构之二叉搜索树(BST)--JavaScript实现

    原理: 叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树的存储结构.中序遍历二叉排序树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程 ...

  2. javascript数据结构与算法-- 二叉树

    javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...

  3. 第一章:javascript: 数据结构与算法

    在前端工程师中,常常有一种声音,我们为什么要学数据结构与算法,没有数据结构与算法,我们一样很好的完成工作.实际上,算法是一个宽泛的概念,我们写的任何程序都可以称为算法,甚至往冰箱里放大象,也要通过开门 ...

  4. JavaScript数据结构——树

    树:非顺序数据结构,对于存储需要快速查找的数据非常有用. 二叉树:二叉树中的节点最多只能有两个子节点(左侧子节点和右侧子节点).这些定义有助于我们写出更高效的向/从树中插入.查找和删除节点的算法. 二 ...

  5. JavaScript数据结构 (手打代码)

    array: 数组创建: ); //创建一个长度为6的数组 ,,,,,); 数组方法: var str="I love javascript"; var single=str.sp ...

  6. JavaScript的数据结构和算法

    所有JavaScript对象都有hasOwnProperty(value)的方法,用来返回一个表明对象是不是具有这个value Key值属性的布尔值. javaScript的方法 具有delete的方 ...

  7. JavaScript笔记 #07# 用js写算法

    算法盒子初代(为了提高学习算法的热情...) 效果图: 所有代码放在单个html中: <!DOCTYPE html> <html> <head> <meta ...

  8. javascript数据结构与算法---二叉树(删除节点)

    javascript数据结构与算法---二叉树(删除节点) function Node(data,left,right) { this.data = data; this.left = left; t ...

  9. javascript数据结构与算法---二叉树(查找最小值、最大值、给定值)

    javascript数据结构与算法---二叉树(查找最小值.最大值.给定值) function Node(data,left,right) { this.data = data; this.left ...

随机推荐

  1. Android中菜单图标等系统自带的图标

    Android™ 2.1 android.R.drawable Icon Resources Android™ 1.5 android.R.drawable Icon Resources Androi ...

  2. JavaScript的DOM编程--12--innerHTML属性

    innerHTML属性: 1). 浏览器几乎都支持该属性, 但不是 DOM 标准的组成部分. innerHTML 属性可以用来读, 写某给定元素里的 HTML 内容 <html> < ...

  3. 为Python添加中文关键字

    狗屎咖啡 2 个月前 原址: https://zhuanlan.zhihu.com/p/31159526 swizl/cnpython 1. 大部分语法,可以按下面方法加同义的中文token第1步. ...

  4. KVO键值观察的具体实现

    1.KVO简介 KVO是Objective-C对观察者设计模式的一种实现,它提供一种机制,指定一个被观察对象(如A类),当对象中的某个属性发生变化的时候,对象就会接收到通知,并作出相应的处理.在MVC ...

  5. windows64 系统下安装Nodejs

    1.nodejs安装: 版本号: node-v8.9.3-x64 检测安装成功:(这个版本已经集成了npm) 2.npm作为一个NodeJS的模块管理,先配置npm的全局模块的存放路径以及cache的 ...

  6. 深入理解ES6之—块级绑定

    var声明与变量提升 使用var关键字声明的变量,无论其实际声明位置在何处,都会被视为声明于所在函数的顶部(如果声明不在任意函数内,则视为在全局作用域的顶部).这就是所谓的变量提升. 块级声明 块级声 ...

  7. Redis随笔(一)Linux Redis 搭建

    1.到官网下载redis上传服务器或者使用wget 下载 wget redis下载的路径 2.查看linux是否安装编译环境gcc,没有先安装 yum -y install gcc 3.解压redis ...

  8. 统计学习方法学习(四)--KNN及kd树的java实现

    K近邻法 1基本概念 K近邻法,是一种基本分类和回归规则.根据已有的训练数据集(含有标签),对于新的实例,根据其最近的k个近邻的类别,通过多数表决的方式进行预测. 2模型相关 2.1 距离的度量方式 ...

  9. Zabbix实战-简易教程--技巧(本地化)

    1.zabbix的logo图标替换(不建议修改) 3.0版本以下: 1.修改/usr/share/zabbix/include/page_header.php 2.修改/usr/share/zabbi ...

  10. java_web学习(六) request对象中的get和post差异

    1.get与post的区别 Get和Post方法都是对服务器的请求方式,只是他们传输表单的方式不一样. 下面我们就以传输一个表单的数据为例,来分析get与Post的区别 1.1 get方法  jsp中 ...