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

javaScript的方法 具有delete的方法 事实上在业务中很少去删除真实的数据,但是在做一下添加和删除时 为了配合后端 也是会用到的。

在javaScript中我们通常使用数据结构是对象和数组, 更常用的是链表结构,添加和删除方便,不需要去遍历。这是一个很节省性能的事情。

new.target 是一个新增的管理 实例函数的方法  如果这个函数被new 或者继承调用 那么就会被返回当前的class或者function 否则返回一个undefined 需要些在constructor里。

set类 在JavaScript中体现为集合的形式 类似对象不同于对象只能一组一组的保存,是可以多组进行保存的类比其他的语言set类 它算是比较完善的了,set类的结构 类似{1:1,2:2} 以key:value的形式保存起来。 我们可以使用它用来求交集,并集,差集,子集等等 类似于对象所以我们可以使用delete 来它其中的某一项,获取它的长度可以通过 用Object.keys来枚举它拿到这个数组的length。添加可以使用其自己本省所带的add的方法。检测是否有这个属性key 我们可以使用hasOwnProperty()的方法来确认这个属性。 这里的集合存储的是一组互不相同的元素.(也就是说这里不适用多重集)。

散列表和字典结构 在JavaScript中体现为Map类。顾名思义 主要是为了做映射使用。用来存储唯一的值,结构也是使用key: value的形式。

非顺序数据结构有散列法和树。

一个树的结构包含一系列的父子关系的节点。每个节点都有一个父节点(除了顶部的第一个节点)以及零个或多个子节点。

(这里图的第二层8是错误的 应该是5)

位于树顶部的节点叫做根节点。它没有父节点。树种的每个元素都叫做节点。节点分为内部节点和外部节点。 至少有一个字节点的节点称为内部节点(7,5,9,15,13,20是内部节点).没有子元素的节点称为外部节点或叶节点(3,6,8,10,12,14,18,25都是叶节点)。

 一个节点可以有祖先和后代。一个节点(除了根节点)的祖先包括父节点,祖父节点,曾祖父节点等等一个节点的后代包括它下面的所有节点。如图上节点9的祖先节点有7和11,而他的字节点有8和10.

有关于树的另一个术语是子树。子树由节点和它的后代构成。比如节点13和12,14构成了图中的子树。

节点的一个属性是深度,节点的深度取决于它的祖先节点的数量。比如,节点10有3个祖先节点(9,7,11),那么它的深度就是3.

树的高度取决于所有节点深度的最大值。一棵树也可以被分解成层级。根节点在第0层,它的字节点在第一层。

二叉树和二叉搜索树

二叉树的节点最多只能有两个子节点:一个是左侧子节点,另一个是右侧的子节点。这些定义有助于我们写出更高效的向/从树中插入,查找和删除节点的算法。

上图就是一个二叉搜索树(BST)。属于二叉树的一种。

如何用代码去申明一个二叉搜索树。

首先定义一个function BinarySearchTree类。

首先:  我们先明确二叉搜索树.

class BinarySearchTree {
consturtor() {
this.Node = class {
consturtor(key){
 this.key = key; //这是我们的节点值 变量私有化
this.left = null ; // 根节点起始左位置的初始化
this.right = null; // 根节点起始右位置的初始化
    }
}
this.root = null ; //起始的根节点
}
}

和链表一样,都是通过指针来表示节点之间的关系(术语称为边)。在双向链表中,每个节点都包含两个指针,一个指向下一个节点,一个指向上一个节点。对于树,使用同样的方式(也使用两个指针)

     class BinarySearchTree {
constructor() {
this.Node = class {
constructor(key){
 this.key = key; //这是我们的节点值 变量私有化
this.left = null ; // 根节点起始左位置的初始化
this.right = null; // 根节点起始右位置的初始化
    }
}
this.root = null ; //起始的根节点
}
insert(key) {
const newNode = new this.Node(key);
if (this.root === null) {
this.root = newNode;
} else {
this.insertNode(this.root, newNode);
}
}
insertNode(node, newNode) { // 尾递归查询节点
if (newNode.key < node.key) { //如果新的节点值小于父节点的值
if (node.left === null) {
node.left = newNode;
} else {
this.insertNode(node.left, newNode);
}
} else {
if (node.right === null) {
node.right = newNode;
} else {
this.insertNode(node.right, newNode);
}
}
}
}
const BinarySearchTree1 = new BinarySearchTree();
BinarySearchTree1.insert(11);
BinarySearchTree1.insert(7);
BinarySearchTree1.insert(15);
BinarySearchTree1.insert(5);
BinarySearchTree1.insert(3);
BinarySearchTree1.insert(9);
BinarySearchTree1.insert(8);
BinarySearchTree1.insert(10);
BinarySearchTree1.insert(13);
BinarySearchTree1.insert(12);
BinarySearchTree1.insert(14);
BinarySearchTree1.insert(20);
BinarySearchTree1.insert(18);
BinarySearchTree1.insert(25);
console.log(BinarySearchTree1);

这样我们就实现了 插入的方法。

这就是我们得到的二叉树。

树的遍历分为三种 中序遍历 先序遍历 后序遍历

中序遍历是一种以上行顺序的访问的BST所有节点的遍历方式,也就是以从最小到最大的顺序访问所有节点。中序遍历的一种应用就是对树进行排序操作。

      class BinarySearchTree {
constructor() {
this.Node = class {
constructor(key){
 this.key = key; //这是我们的节点值 变量私有化
this.left = null ; // 节点起始左位置的初始化
this.right = null; // 节点起始右位置的初始化
    }
}
this.root = null ; //起始的根节点
}
insert(key) {
const newNode = new this.Node(key);
if (this.root === null) {
this.root = newNode;
} else {
this.insertNode(this.root, newNode);
}
}
insertNode(node, newNode) {
if (newNode.key < node.key) { //如果新的节点值小于父节点的值
if (node.left === null) {
node.left = newNode;
} else {
this.insertNode(node.left, newNode);
}
} else {
if (node.right === null) {
node.right = newNode;
} else {
this.insertNode(node.right, newNode);
}
}
}
inOrderTraverseNode(node, callback) {
if (node !== null) { //{2}
this.inOrderTraverseNode(node.left, callback); //{3}
callback(node.key); //{4}
this.inOrderTraverseNode(node.right, callback); //{5}
}
}
inOrderTraverse(callback) {
this.inOrderTraverseNode(this.root, callback);
}
printNode(value) {
console.log(value);
}
}
const BinarySearchTree1 = new BinarySearchTree();
BinarySearchTree1.insert(11);
BinarySearchTree1.insert(7);
BinarySearchTree1.insert(15);
BinarySearchTree1.insert(5);
BinarySearchTree1.insert(3);
BinarySearchTree1.insert(9);
BinarySearchTree1.insert(8);
BinarySearchTree1.insert(10);
BinarySearchTree1.insert(13);
BinarySearchTree1.insert(12);
BinarySearchTree1.insert(14);
BinarySearchTree1.insert(20);
BinarySearchTree1.insert(18);
BinarySearchTree1.insert(25);
BinarySearchTree1.inOrderTraverse(BinarySearchTree1.printNode);
console.log(BinarySearchTree1);

搜索树中的值

在树中, 有三种经常执行的搜索类型:

最小值;

最大值;

搜索特定的值。

搜索最小值和最大值

JavaScript的数据结构和算法的更多相关文章

  1. javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例

    栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...

  2. JavaScript 版数据结构与算法(二)队列

    今天,我们要讲的是数据结构与算法中的队列. 队列简介 队列是什么?队列是一种先进先出(FIFO)的数据结构.队列有什么用呢?队列通常用来描述算法或生活中的一些先进先出的场景,比如: 在图的广度优先遍历 ...

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

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

  4. JavaScript 版数据结构与算法(一)栈

    今天,我们要讲的是数据结构与算法中的栈. 栈的简介 栈是什么?栈是一个后进先出(LIFO)的数据结构.栈有啥作用?栈可以模拟算法或生活中的一些后进先出的场景,比如: 十进制转二进制,你需要将余数倒序输 ...

  5. JavaScript 版数据结构与算法(三)链表

    今天,我们要讲的是数据结构与算法中的链表. 链表简介 链表是什么?链表是一种动态的数据结构,这意味着我们可以任意增删元素,它会按需扩容.为何要使用链表?下面列举一些链表的用途: 因为数组的存储有缺陷: ...

  6. JavaScript 版数据结构与算法(四)集合

    今天,我们要讲的是数据结构与算法中的集合. 集合简介 什么是集合?与栈.队列.链表这些顺序数据结构不同,集合是一种无序且唯一的数据结构.集合有什么用?在 Python 中,我经常使用集合来给数组去重: ...

  7. javascript实现数据结构与算法系列:循环链表与双向链表

    循环链表(circular linked list) 是另一种形式的链式存储结构.它的特点是表中最后一个结点的指针域指向头结点,整个表形成一个环. 循环链表的操作和线性链表基本一致,仅有细微差别. w ...

  8. javascript实现数据结构与算法系列

    1.线性表(Linear list) 线性表--简单示例及线性表的顺序表示和实现 线性表--线性链表(链式存储结构) 线性表的静态单链表存储结构 循环链表与双向链表 功能完整的线性链表 线性链表的例子 ...

  9. JavaScript 的数据结构与算法

    1数组 1.1方法列表 数组的常用方法如下: concat: 链接两个或者更多数据,并返回结果. every: 对数组中的每一项运行给定的函数,如果该函数对每一项都返回true,则返回true. fi ...

随机推荐

  1. 网络协议 15 - P2P 协议:小种子大学问

    [前五篇]系列文章传送门: 网络协议 10 - Socket 编程(上):实践是检验真理的唯一标准 网络协议 11 - Socket 编程(下):眼见为实耳听为虚 网络协议 12 - HTTP 协议: ...

  2. Vue.js-05:第五章 - 计算属性与监听器

    一.前言 在 Vue 中,我们可以很方便的将数据使用插值表达式( Mustache 语法)的方式渲染到页面元素中,但是插值表达式的设计初衷是用于简单运算,即我们不应该对差值做过多的操作.当我们需要对差 ...

  3. linux(centos)上安装mysql教程,为需要远程登录的用户赋予权限

    最近把之前学生时代的win server换成了linux(centos)系统,因为win对于部署一些项目时候比较麻烦,直接入正题 1.准备阶段 我使用xshell工具管理服务器,相应下载和安装自行百度 ...

  4. MATLAB程序:用FCM分割脑图像

    MATLAB程序:用FCM分割脑图像 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 脑图像基础知识请看:脑图像:FCM算法介绍请看:聚类——FCM:数据 ...

  5. 一套代码小程序&Web&Native运行的探索02

    接上文:一套代码小程序&Web&Native运行的探索01,本文都是一些探索性为目的的研究学习,在最终版输出前,内中的内容可能会有点乱 参考: https://github.com/f ...

  6. sql学习笔记(三)—— 联表查询

    上篇写了一些sql查询的知识,这篇接着写一下有关联表查询的知识. 既然是联表查询,那肯定得多个表啊,所以,我们先创建一个教师表,表名为 teacher,并且向表中插入数据. 准备工作: 创建表语句: ...

  7. [转] 以后再有人问你selenium是什么,你就把这篇文章给他

    本文转自:https://blog.csdn.net/TestingGDR/article/details/81950593 写在最前面:目前自动化测试并不属于新鲜的事物,或者说自动化测试的各种方法论 ...

  8. spring boot拦截器中获取request post请求中的参数

    最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...

  9. jQuery从小白开始---初始jQuery

    jQuery是什么? jQuery是一款优秀的JavaScript库,从命名可以看出jQuery最主要的用途就是用来做查询(jQuery=js+Query),正如jQuery官方Logo副标题所说(w ...

  10. MPP-编码示例

    了解MPP的基本功能后,接下来具体分析编码的代码.首先把编码的代码提取出来,方便以后的使用. 完整的编码代码如下,相比较给出的示例代码,做了一些改动,输入的指令全部去除,将函数入口改为利用OpenCV ...