二叉树,首先了解一些关于二叉数的概念(来自百度百科)

1. 二叉树(Binary tree)是树形结构的一个重要类型

2. 定义: 二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树

3. 二叉树可以分为: (1.)空二叉树  ;(2.) 只有一个根结点的二叉树 ; (3. ) 只有左子树 ;(4.)只有右子树,(5.)完全二叉树; (6.)满二叉树

4.  相关术语

①结点:包含一个数据元素及若干指向子树分支的信息 
②结点的度:一个结点拥有子树的数目称为结点的度
③叶子结点:也称为终端结点,没有子树的结点或者度为零的结点 
④分支结点:也称为非终端结点,度不为零的结点称为非终端结点 
⑤树的度:树中所有结点的度的最大值 
⑥结点的层次:从根结点开始,假设根结点为第1层,根结点的子节点为第2层,依此类推,如果某一个结点位于第L层,则其子节点位于第L+1层 
⑦树的深度:也称为树的高度,树中所有结点的层次最大值称为树的深度
 
相关概念了解后,我们使用ts 来写一个二叉数
 

一、声明一个节点的数据结构接口

type INodeTree<T> = {
value: T;
left: INodeTree<T>|null;
right: INodeTree<T>|null;
}

二、 实现一个节点类

//实现节点对象
class TNode<T>{
public value:T
public left:INodeTree<T>|null;
public right:INodeTree<T>|null;
constructor(data:T){
this.value = data
this.left = null
this.right = null
}
}

三、实现一个二叉数类

1. 进行二叉排序

2. 前序遍历:

3. 中序遍历

4. 后续遍历

5. 层次遍历

6. 找最大值

7. 找最小值

 class BinaryTree<T>{
private data:T[]
private rootNode:INodeTree<T>
/**
*
* @param data
*/
constructor(data:T[]){
if(!Array.isArray(data)||data.length<1){
throw("参数必须为数组且数组长度不能少于1")
}
this.data = data
this.rootNode = new TNode(data[0]);////初始化根节点 }
/**
* 二叉排序
* 1. 先判断当前节点node的值 与入排的值key 比大小,小进左,大近右,相等的话默认进右边
* 2. 然后判断是否存在子节点,如果存在,递归比较,否侧,就进排
*/
public sortNode():INodeTree<T>{
let handleSortNode = (node:INodeTree<T>,key:T)=>{
// 对比大小
if(node.value>key){ //判断是否存在左子节点
if(node.left===null){
if(key){
node.left = new TNode(key)
} }else{
handleSortNode(node.left,key)
} }else{
//右边同理
if(node.right==null){
if(key){
node.right = new TNode(key)
} }else{
handleSortNode(node.right,key)
}
}
}
for(let i =1;i<this.data.length;i++){
handleSortNode(this.rootNode,this.data[i])
}
return this.rootNode
} /**
* 中序遍历:从根节点开始遍历,从左向右开始访问,根节点值在中间;简单理解就是: 左子树->父节点->右子树
*/
public orderSortNode():Array<T>{
let res:T[] = [];
let orderRraverNode = function(node:INodeTree<T>|null){
if(!node) return
orderRraverNode(node.left)
res.push(node.value)
orderRraverNode(node.right) }
orderRraverNode(this.rootNode)
return res
}
/**
* 前序遍历:从根节点开始遍历,从左向右开始访问,最先输出根节点值;简单理解就是: 父节点->左子树->右子树
*/
public beforeSortNode():Array<T> {
let res:T[] = [];
let beforeRraverNode = function(node:INodeTree<T>|null){
if(!node) return
res.push(node.value)
beforeRraverNode(node.left)
beforeRraverNode(node.right) }
beforeRraverNode(this.rootNode)
return res
} /**
* 后序遍历:从根节点开始遍历,从左向右开始访问,最后才输出根节点值;简单理解就是: 左子树->右子树->父节点
*/
public afterSortNode() {
let res:T[] = [];
let afterRraverNode = function(node:INodeTree<T>|null){
if(!node) return
afterRraverNode(node.left)
afterRraverNode(node.right)
res.push(node.value) }
afterRraverNode(this.rootNode) return res
} /**
* 层次遍历:按照树的层次自上而下的遍历二叉树;利用队列实现
*/
public levelSortNode():T[]{
let queue = [this.rootNode];//直接根节点入队
let res:T[] = []
while(queue.length>0){
let node = queue.shift();//出队
if(node){
res.push(node.value)
if(node.left){
queue.push(node.left);//入队
}
if(node.right){
queue.push(node.right);//入队
}
}
}
return res
} /**
* 找最小值,其实就是递归左子节点
*/
public minNodeValue():T { let res:T = this.rootNode.value;
let minNode = this.rootNode.left
while(minNode&&minNode.left){
minNode = minNode.left;
res = minNode.value
}
return res
} /**
* 找最小值,其实就是递归右子节点
*/
public maxNodeValue():T {
let res:T = this.rootNode.value;
let maxNode = this.rootNode.right
while(maxNode&&maxNode.right){
maxNode = maxNode.right;
res = maxNode.value
}
return res
}
}

4. 创建一个工厂函数(可省略)

function createBinaryTree<T>(data:T[]){
return new BinaryTree(data)
}

5. 调用示例 

// let arr = [10,5,1,3,8,4,2,12,17,11,14,12,20]
let arr = ['C', 'B', 'E', 'A',"H",'D']
let res = createBinaryTree(arr)
// 二叉排序
let resSort = res.sortNode()
console.log(resSort) // 中序遍历
let resO = res.orderSortNode()
console.log("resO",resO) // 前序遍历
let resB = res.beforeSortNode()
console.log("resB",resB) // 后序遍历
let resF = res.afterSortNode()
console.log("resF",resF) // 层次遍历
let resL = res.levelSortNode()
console.log("resL",resL) // 最小值
let resMin = res.minNodeValue()
console.log(resMin) //最大值
let resMax= res.maxNodeValue()
console.log(resMax)
 

javascript 数据结构与算法---二叉数的更多相关文章

  1. 数据结构:JAVA_二叉数查找树基本实现(中)

    数据结构:二叉数查找树基本实现(JAVA语言版) 1.写在前面 二叉查找树得以广泛应用的一个重要原因是它能保持键的有序性,因此我们可以把它作为实现有序符号表API中的众多方法的基础. 也就是说我们构建 ...

  2. 学习JavaScript数据结构与算法 (二)

    学习JavaScript数据结构与算法 的笔记 包含第四章队列, 第五章链表 本人所有文章首发在博客园: http://www.cnblogs.com/zhangrunhao/ 04队列 实现基本队列 ...

  3. javascript数据结构——写一个二叉搜索树

    二叉搜索树就是左侧子节点值比根节点值小,右侧子节点值比根节点值大的二叉树. 照着书敲了一遍. function BinarySearchTree(){ var Node = function(key) ...

  4. 数据结构:JAVA_二叉数查找树基本实现(上)

    数据结构:二叉数查找树基本实现(JAVA语言版) 1.写在前面 二叉查找树是一种能将链表插入的灵活性与有序数组查找的高效性结合在一起的一种数据结构. ..... 2.代码分解 2.1 对节点的结构定义 ...

  5. JavaScript数据结构与算法(二) 队列的实现

    TypeScript方式源码 class Queue { items = []; public enqueue(element) { this.items.push(element); } publi ...

  6. JavaScript 数据结构与算法之美 - 非线性表中的树、堆是干嘛用的 ?其数据结构是怎样的 ?

    1. 前言 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手. 非线性表(树.堆),可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法 ...

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

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

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

    javascript数据结构与算法--二叉树遍历(先序) 先序遍历先访问根节点, 然后以同样方式访问左子树和右子树 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...

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

    javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...

随机推荐

  1. Numpy访问数组元素

    import numpy as np n = np.array(([1,2,3],[4,5,6],[7,8,9])) ''' array([[1, 2, 3], [4, 5, 6], [7, 8, 9 ...

  2. ASP.NET Core 监听SQL Server数据库的实时信息

    1.开发环境: 开发工具:Visual Studio 2019 数据库:SQL Server2012 开发环境:.Net Core 3.1 2.使用技术: Signalr:实现消息推送 SqlDepe ...

  3. 11-Pandas之排序(df.sort_index()、df.sort_values()、随机重排、随机采样)

    排序是一种索引机制的一种常见的操作方法,也是Pandas重要的内置运算,主要包括以下3种方法: 排序方法 说明 sort_values() 根据某一列的值进行排序 sort_index() 根据索引进 ...

  4. 安装ElasticSearch遇到的深坑

    实验需要ES,安装过程中遇到一些奇葩的问题,记录下.下面介绍下安装步骤: 第一步:安装java ES是运行在java虚拟机上面的,所以首先需要安装java环境,安装过程不再赘述,唯一需要注意的是ES对 ...

  5. .Net Core 实体生成器

    实体生成器是什么? 实体生成器的功能就是自动将数据库中的表以及字段 转化成我们 高级编程语言中的实体类. 我们为什么要用实体生成器 在.net core开发环境下,我们可以使用efcore这个orm来 ...

  6. Springboot使用JdbcTemplate的使用

    在spring-boot-starter-jdbc这个依赖包中一共分成四个部分. core,JdbcTemplate等相关核心接口和类 datasource,数据源相关的辅助类 object,将基本的 ...

  7. stl_heap

    学习一下stl_heap 下面的算法是根据stl源码重新整合一下,是为了方便理解 因为使用的迭代器,为了在给定的迭代器之间使用heap的一些方法, 内部通常用disHole来确定某个节点 dishol ...

  8. 【BZOJ1426】收集邮票 题解 (期望)

    题目:有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢邮票,所以皮 ...

  9. Python解决网吧收费系统,远控网吧电脑设备!

    python破解网吧收费系统,远控网吧电脑设备! 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更 ...

  10. jquery 效果笔记

    jquery效果 显示隐藏     show()     语法     show([speed,[easing],[fn]])     参数可以省略,无动画直接使用     hide()     to ...