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 os.major() 方法
概述 os.major() 方法用于从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field).高佣联盟 www.cgewang.com 语法 major( ...
- PHP fstat() 函数
定义和用法 fstat() 函数返回关于一个打开的文件的信息. 该函数将返回一个包含下列元素的数组: [0] 或 [dev] - 设备编号 [1] 或 [ino] - inode 编号 [2] 或 [ ...
- PHP imagecolorclosestalpha - 取得与指定的颜色加透明度最接近的颜色的索引
imagecolorclosestalpha — 取得与指定的颜色加透明度最接近的颜色的索引.高佣联盟 www.cgewang.com 语法 int imagecolorclosestalpha ( ...
- 三类安装VMTools失败的解决方法(Windows、Linux、MacOs)
前言 写这篇笔记的原因,是前几天在虚拟机 Vmware 中重新安装了几个操作系统,突然发现 VMTools 这个工具成了一个特殊的问题,以前还没有发现,因为通常它就给你自动安装了.但是大多数时候也是需 ...
- Sharding-JDBC实现垂直拆分
参考资料:猿天地 https://mp.weixin.qq.com/s/wl8h6LIQUHztVuVbjfsU3Q 作者:尹吉欢 当一个项目量增大,数据表数量增多时,就需要对数据表进行垂直拆分, ...
- 015_go语言中的闭包
代码演示 package main import "fmt" func intSeq() func() int { i := 0 return func() int { i++ r ...
- JS 鼠标、键盘事件对象
鼠标事件对象 mouseEvent鼠标事件对象 e.clientX 在可视区的x和y的坐标 e.pageX 在页面文档的X和Y的坐标 <script> docume ...
- Unity 笔记
摄像机 Main Camera 跟随主角移动,不看 UI 剧情摄像机 当进入剧情时,可以关闭 main camera,启用剧情摄像机,不看 UI UI 摄像机 看 UI Unity编辑器常用的sett ...
- puppet单机模型
puppet配置 命令 facter -p: 显示所有的变量 puppet apply [-v] [--noop] [-e 'puppet expression: 一般为include httpd等' ...
- pyinstaller 转 exe 的一些坑,以及解决
2020年7月30日 打包了一个程序,各种报错,记录一下1.有时候,这个pyinstaller 打包程序吧,会出现闪退一下,一般原因是因为某个包没有加载进来,或者是包所在的路劲下面有中文,这样打包成功 ...