javascript中的二叉树一(binary tree)

  毕业也快2年了,毕业之后就没有认真写过博客了,都是那里学习一下,这里弄一下。学习了也不做笔记,过后就忘记了。我对这种状态打从心里是讨厌的。

  进入正题,今天的笔记是记录javascript二叉树的学习,是非常基本的知识加上一些自己的认识。适合想了解javascript二叉树的萌新,大神请绕路走,当然如果发现有什么理解上的错误,还望不吝赐教。

                                  ===================漂亮的分割线===================

  首先说下我对二叉树的理解:

    1,二叉树是由一系列有规则的节点构成

    2,二叉树每一个节点可以看成为对象,必有key(节点值),可以有left(节点),right(节点)这三个属性

    3,每个节点的left节点的key必定小于当前key值

    4,每个节点的right节点的key必定大于当前的key值

  那么假如我们要把一个数组构成二叉树,需要哪些代码?很简单,记住上面的几点,我们来一步一步把数组变成二叉树形式

  

  一,

    1,二叉树是由一系列有规则的节点构成,

       2,二叉树每一个节点可以看成为对象,必有key(节点值),可以有left(节点),right(节点)这三个属性

    思考: 数组的每一个值将变成二叉树的节点(先不管这个节点怎么排序),那么我们在循环数组的时候,是不是都要处理下?

    答: 我定义下面一个类,到时候就可以依次实例化为节点了。看下好不好理解...

//节点类
class Node {
constructor(key) {
this.left = null
this.right = null
this.key = key
}
}

进一步解释: 当循环数组的时候,就可以把每一个数组项,实例化为节点,类似这样new Node(数组Item)

  二,

    3,每个节点的left节点的key必定小于当前key值

    4,每个节点的right节点的key必定大于当前的key值

    这2点是生成二叉树的规则。那我们是不是应该有一个二叉树类呢?

    //二叉树类
class BinaryTree{ }

  思考: 二叉树类要哪些东西呢?补充类看下是不是应该这些

//二叉树类
class BinaryTree {
constructor() {
this.root = null //二叉树根节点
}
insert (key) { //插入节点的方法
}
}

解释: 每一个二叉树实例应该都有一个根节点,然后暴露一个可以插入节点的方法(先不管插入规则,后续讲解)

接下来就是重点了: 如何实现插入逻辑能实现上面3,4两点规则呢?

  第一点:我们要确定一个根节点,然后在根节点基础上实现二分法

  完善insert方法如下:

  

class BinaryTree {
constructor() {
this.root = null
}
insert (key) {
const newNode = new Node(key) // 这里也可以在数组那里执行,但这里可以避免多次实例操作
if (this.root === null) {
this.root = newNode
} else {
this.inOrderTraversNode(this.root, newNode)
}
}
inOrderTraversNode (node, newNode) {
}
}

解释:当调用insert方法的时候都先确定root的值,然后在根节点为入口进行二分。inOrderTraversNode方法就负责二分法。

思考: inOrderTraversNode方法怎么样实现二分法?

答: 该方法为一个递归方法。功能为:有2个参数,一个是当前已经存在的节点,后一个是要插入的新节点,就是把新节点插入到当前节点的正确的(左节点或者右节点)位置。

比如:当根节点确定之后,调用该方法插入一个新左节点,此时形成了2个节点的二叉树。此时若又一个左节点需要插入,我们就能可以递归调用该方法实现了。

//二叉树类
class BinaryTree {
constructor() {
this.root = null
}
insert (key) {
const newNode = new Node(key)
if (this.root === null) {
this.root = newNode
} else {
this.inOrderTraversNode(this.root, newNode)
}
}
inOrderTraversNode (node, newNode) {
if (newNode.key < node.key) { // 左插
if (node.left === null) {
node.left = newNode
}else{
this.inOrderTraversNode(node.left, newNode)
}
} else { // 右插
if (node.right === null) {
node.right = newNode
} else {
this.inOrderTraversNode(node.right, newNode)
}
}
}
}

所有代码在这里,可以好好理解下

const node = [8, 1, 3, 10, 12, 6, 13, 15, 18, 7]

//节点类
class Node {
constructor(key) {
this.left = null
this.right = null
this.key = key
}
} //二叉树类
class BinaryTree {
constructor() {
this.root = null
}
insert (key) {
const newNode = new Node(key)
if (this.root === null) {
this.root = newNode
} else {
this.inOrderTraversNode(this.root, newNode)
}
}
inOrderTraversNode (node, newNode) {
if (newNode.key < node.key) { // 左插
if (node.left === null) {
node.left = newNode
}else{
this.inOrderTraversNode(node.left, newNode)
}
} else { // 右插
if (node.right === null) {
node.right = newNode
} else {
this.inOrderTraversNode(node.right, newNode)
}
}
}
} const binaryTree = new BinaryTree()
node.map(function(item) {
binaryTree.insert(item)
}) console.log(binaryTree.root)

  

javascript二叉树的更多相关文章

  1. javascript - 二叉树

    都是些简单的东西,所以直接上代码了. /** * Created by huangjacky on 14-10-3. */ function Node(element, left, right) { ...

  2. javascript二叉树基本功能实现

    都是常用的功能. 删除是最复杂的.. <!DOCTYPE html> <html lang="en"> <head> <meta char ...

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

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

  4. 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java

    前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...

  5. JavaScript 实现二叉树

    JavaScript 实现二叉树: // JavaScript 实现二叉树 function BinaryTree () { var Node = function (key) { this.key ...

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

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

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

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

  8. JavaScript实现二叉树算法

    二叉树的遍历方式 分别为中序遍历(左子树->当前节点->右子树).前序遍历(当前节点->左子树->右子树).后序遍历(左子树->右子树->当前节点).下面使用Jav ...

  9. javascript数据结构与算法--二叉树遍历(后序)

    javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...

随机推荐

  1. python3的一些文件操作的脚手架

    用python把原来的脚本重构了一下,其中写了文件操作的一些函数,如下: import os import shutil import hashlib import stat #查找文件夹中的某个文件 ...

  2. django-restframework使用

    安装restframework: pip install djangorestframework 修改项目settings.py: INSTALLED_APPS = [ 'django.contrib ...

  3. 2019icpc徐州网络赛

    A Who is better? 题意 excrt+斐波那契博弈 分析 Java的BigInteger对象默认为null,不能直接比较. 代码 import java.math.BigInteger; ...

  4. 如何解决 u盘 错误0x80071AC3:请运行chkdsk并重试

    windows: 一.win+R 打开 cmd 二.确认好U盘在电脑上显示的盘符,输入代码:chkdsk G:/f (G为U盘所在盘符) Bonus:U盘一般会有文件系统,主要有NTFS.FAT16. ...

  5. mysql复制表结构,复制表数据

    MYSQL 复制表 show create table table_name:查看表的建表语句.该语句包含了原数据表的结构,索引等. 使用 SHOW CREATE TABLE 命令获取创建数据表(CR ...

  6. crm客户资源显示控制

    为便于员工之间的良性竞争,避免恶意挖客户,对于不同的登录用户,在客户列表中只显示当用用户自己所拥有的客户列表. ---具体的,通过在列表显示界面的列表查询语句中增加根据用户id查询其对应的客户资源的条 ...

  7. sql:union 与union的使用和区别

    SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...

  8. SpringBoot+SpringCloud 笔记

    SpringBoot总结 使用Typora打开https://pan.baidu.com/s/1tXS45j6ooXpnzhy1Zp78Gw 提取码: c8fi SpringCloud总结 使用XMi ...

  9. vim 添加显示和行号

    方法一: 1.显示当前行行号,在VI的命令模式下输入 :nu 2.显示所有行号,在VI的命令模式下输入 :set nu :set nonu 关闭 方法二: 使用vi编辑~/.vimrc文件,在该文件中 ...

  10. [uboot] (第一章)uboot流程——概述(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/ooonebook/article/det ...