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上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
随机推荐
- Python File tell() 方法
概述 tell() 方法返回文件的当前位置,即文件指针当前位置.高佣联盟 www.cgewang.com 语法 tell() 方法语法如下: fileObject.tell() 参数 无 返回值 返回 ...
- 2020牛客暑假多校训练营 第二场 E Exclusive OR FWT
LINK:Exclusive OR 没做出 原因前面几篇说过了. 根据线性基的知识容易推出 不超过\(w=log Mx\)个数字即可拼出最大值 其中Mx为值域. 那么考虑w+2个数字显然也为最大值.. ...
- luogu P1526 [NOI2003]智破连环阵 搜索+最大匹配+剪枝
LINK:智破连环阵 考试的时候 题意没理解清楚 题目是指一个炸弹爆炸时间结束后再放另一个炸弹 而放完一个炸弹紧接另一个炸弹.题目中存在然后二字. 这样我们可以发现某个炸弹只会炸连续的一段. 但是 由 ...
- linux集群服务网络状态(netstat),服务端页面(图形字符页面)基本配置
Linux网络基础配置 yum -y install vim 安装vim 关闭的防火墙服务 iptables -F iptables -X iptables -Z systemctl s ...
- Maven知识记录(一)初识Maven私服
Maven知识记录(一)初识Maven私服 什么是maven私服 私服即私有的仓库.maven把存放文件的地方叫做仓库,我们可以理解成我门家中的储物间.而maven把存放文件的具体位置叫做坐标.我们项 ...
- Archlinux 最新安装方法 (2020.07.01-x86_64)之虚拟机 BIOS 安装
话不多说,直接上干货 准备 去Arch 官网,选择一个合适的国内镜像站下载 Arch 安装包 ISO,地址如下: https://www.archlinux.org/download/ 一.创建虚拟机 ...
- 基于boost的bind与function的一个简单示例消息处理框架
前两年开始接触boost,boost库真是博大精深:今天简单介绍一下boost中之前用到的的bind与function,感觉挺实用的,分享给大家,我对boost用的也不多,让大家见笑了. 上次文发了一 ...
- 用Python快速实现视频的人脸融合
- Axios源码分析
Axios是一个基于promise的HTTP库,可以用在浏览器和node.js中. 文档地址:https://github.com/axios/axios axios理解和使用 1.请求配置 { // ...
- 16、Mediator 仲裁者模式
只有一个仲裁者 Mediator 模式 组员向仲裁者报告,仲裁者向组员下达指示,组员之间不在相互询问和相互指示. 要调整多个对象之间的关系时,就需要用到 Mediator 模式.将逻辑处理交给仲裁者执 ...