javascript 数据结构与算法---二叉数
二叉树,首先了解一些关于二叉数的概念(来自百度百科)
1. 二叉树(Binary tree)是树形结构的一个重要类型
2. 定义: 二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树
3. 二叉树可以分为: (1.)空二叉树 ;(2.) 只有一个根结点的二叉树 ; (3. ) 只有左子树 ;(4.)只有右子树,(5.)完全二叉树; (6.)满二叉树
4. 相关术语
一、声明一个节点的数据结构接口
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 数据结构与算法---二叉数的更多相关文章
- 数据结构:JAVA_二叉数查找树基本实现(中)
数据结构:二叉数查找树基本实现(JAVA语言版) 1.写在前面 二叉查找树得以广泛应用的一个重要原因是它能保持键的有序性,因此我们可以把它作为实现有序符号表API中的众多方法的基础. 也就是说我们构建 ...
- 学习JavaScript数据结构与算法 (二)
学习JavaScript数据结构与算法 的笔记 包含第四章队列, 第五章链表 本人所有文章首发在博客园: http://www.cnblogs.com/zhangrunhao/ 04队列 实现基本队列 ...
- javascript数据结构——写一个二叉搜索树
二叉搜索树就是左侧子节点值比根节点值小,右侧子节点值比根节点值大的二叉树. 照着书敲了一遍. function BinarySearchTree(){ var Node = function(key) ...
- 数据结构:JAVA_二叉数查找树基本实现(上)
数据结构:二叉数查找树基本实现(JAVA语言版) 1.写在前面 二叉查找树是一种能将链表插入的灵活性与有序数组查找的高效性结合在一起的一种数据结构. ..... 2.代码分解 2.1 对节点的结构定义 ...
- JavaScript数据结构与算法(二) 队列的实现
TypeScript方式源码 class Queue { items = []; public enqueue(element) { this.items.push(element); } publi ...
- JavaScript 数据结构与算法之美 - 非线性表中的树、堆是干嘛用的 ?其数据结构是怎样的 ?
1. 前言 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手. 非线性表(树.堆),可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法 ...
- javascript数据结构与算法--二叉树遍历(后序)
javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...
- javascript数据结构与算法--二叉树遍历(先序)
javascript数据结构与算法--二叉树遍历(先序) 先序遍历先访问根节点, 然后以同样方式访问左子树和右子树 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
- javascript数据结构与算法--二叉树遍历(中序)
javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
随机推荐
- MOS 预夹断到底是什么
https://www.cnblogs.com/yeungchie/ MOS管就像一个开关,栅极(Gate)决定源极(Souce)到漏极(Drain)的沟道(Channel)是开还是关.以NMOS为例 ...
- 7.12 NOI模拟赛 探险队 期望 博弈 dp 最坏情况下最优策略 可并堆
LINK:探险队 非常难的题目 考试的时候爆零了 完全没有想到到到底怎么做 (当时去刚一道数论题了. 首先考虑清楚一件事情 就是当前是知道整张地图的样子 但是不清楚到底哪条边断了. 所以我们要做的其实 ...
- 探讨Netty获取并检查Websocket握手请求的两种方式
在使用Netty开发Websocket服务时,通常需要解析来自客户端请求的URL.Headers等等相关内容,并做相关检查或处理.本文将讨论两种实现方法. 方法一:基于HandshakeComplet ...
- Python实现微信读书辅助工具
[TOC] ##项目来源 这个有意思的项目是我从GitHub上找来的,起因是在不久前微信读书突然就设置了非会员书架数目上限,我总想做点什么来表达我的不满,想到可否用爬虫来获取某一本书的内容, 但是我技 ...
- electron开发 - 打印流程(仅支持6.0.0版本以上)
Electron打印 标签打印 标签打印一般有两种方式: 驱动打印,与普通打印机一样通过驱动方式打印. 通过指令打印,不同厂家的的打印机指令集不一样,可查看厂家提供的手册. electron 打印方式 ...
- 阿里云ECS服务器购买流程
先说说什么是阿里云服务器ECS?云服务器(Elastic Compute Service,即弹性计算服务,简称ECS)是阿里云提供的性能卓越.稳定可靠.弹性扩展的IaaS(Infrastructure ...
- JS解密入门——有道翻译
JS解密入门——有道翻译 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这 ...
- java_字节流、字符流的使用方法
字节流 字节输出流[OutputStream] java.io.OutputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地.它定义了字节输出流的基本共性功能方法. p ...
- XCTF-WEB-高手进阶区-PHP2-笔记
鬼才作者...特么卡了我那么长时间,这知识点我真不知道 o(╥﹏╥)o 拿Dirserach扫只能扫出来index.php和index.php/login 一度让我怀疑是有我不会的姿势去解这道题 最后 ...
- Java 字节流
OutputStream此抽象类,是表示输出字节流的所有类的超类.操作的数据都是字节,定义了输出字节流的基本共性功能方法. OutputStream有很多子类,其中子类FileOutputStream ...