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上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
随机推荐
- ZROI 提高十连测 DAY2
总结:入题尽量快,想到做法要先证明是否正确是否有不合法的情况,是否和题目中描述的情景一模一样. 不要慌 反正慌也拿不了多少分,多分析题目的性质如果不把题目的性质分析出来的话,暴力也非常的难写,有 ...
- Multiple dex files define解决记录
引用多个library时经常会遇到Multiple dex files define错误,最常见的是support库多次定义,此时可用以下gradle命令来查看工程的引用树: gradlew -q d ...
- Servlet容器启动过程
参考:https://blog.csdn.net/fredaq/article/details/9366043 一.概念 所谓Servlet容器其实说白了是符合Servlet规范的Java web容器 ...
- Qt 之 Graphics View Framework 简介
Graphics View Framework 交互式 2D 图形的 Graphics View 框架概述.自 Qt4.2 中引入了 Graphics View,以取代其前身 QCanvas.Grap ...
- Linux 下使用 killall 命令终止进程的 8 大用法
Linux 的命令行提供很多命令来杀死进程.比如,你可以向 kill 命传递一个PID来杀死进程:pkill 命令使用一个正则表达式作为输入,所以和该模式匹配的进程都被杀死. 但是还有一个命令叫 ki ...
- cocos2d-x_下载游戏引擎并创建第一个项目
我是一名小白. 下载并创建游戏项目 第一步:去官网下载cocos2d-x http://www.cocos.com/download 第二步:将安装包里边的 setup.py 拖进命令行点击回车键 , ...
- Kaggle-pandas(5)
Data-types-and-missing-values 教程 Dtypes DataFrame或Series中列的数据类型称为dtype.您可以使用dtype属性来获取特定列的类型. 例如,我们可 ...
- 推荐:pyqt5入门教程
版权声明:本文为CSDN博主「AzureMouse」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/azure ...
- C#LeetCode刷题之#409-最长回文串(Longest Palindrome)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3788 访问. 给定一个包含大写字母和小写字母的字符串,找到通过这 ...
- Homekit_DoHome_智能通断器
本款通断器适用于IOS和android系统用户,苹果用户可以非常方便的使用siri进行有效控制,android用户需要下载Dohome App进行操作,同时支持市面上主流的智能音箱进行控制. 对于an ...