js数据结构与算法——二叉树
function BinaryTree(){
var Node = function(key){
this.key = key; //值
this.left = null; //左箭头
this.right = null; //右箭头
}
//根节点
var root = null;
var insertNode = function(oldNode,newNode){
if(newNode.key < oldNode.key){
if(oldNode.left === null){
oldNode.left = newNode
}else{
insertNode(oldNode.left,newNode)//递归查找
}
}else{
if(oldNode.right === null){
oldNode.right = newNode
}else{
insertNode(oldNode.right,newNode);
}
}
}
//插入节点
this.insert = function(key) {
var newNode = new Node(key);
if(root === null){
root = newNode;
}else{
insertNode(root,newNode)
}
}
//中序排列
this.inOrderTraverse = function(callback){
inOrderTraverseNode(root,callback)
}
//中序排序辅助函数
var inOrderTraverseNode = function(node,callback){
if(node !== null){
inOrderTraverseNode(node.left,callback);//遍历左节点
callback(node.key);//遍历根节点,中节点
inOrderTraverseNode(node.right,callback);//遍历右节点
}
}
//先序遍历,先访问节点本身在遍历左节点,最后遍历右节点
this.preOrderTraverse = function(callback){
preOrderTraverseNode(root,callback);
}
var preOrderTraverseNode = (node,callback)=>{
if(node !== null){
callback(node.key);
preOrderTraverseNode(node.left,callback);
preOrderTraverseNode(node.right,callback);
}
}
//后序遍历,先访问节点的后代节点,再访问节点本身
this.postOrderTraverse = function(callback){
postOrderTraverseNode(root,callback);
}
var postOrderTraverseNode = (node,callback) =>{
if(node !== null){
postOrderTraverseNode(node.left,callback);
postOrderTraverseNode(node.right,callback);
callback(node.key);
}
}
//搜索最大值,最小值
this.min = function(){
return minNode(root);
}
var minNode = (node)=>{
if(node){
while(node && node.left !== null){
node = node.left;
}
return node.key
}
return null;
}
this.max = function(){
return maxNode(root);
}
var maxNode = (node) => {
if(node){
while(node && node.right !== null){
node = node.right;
}
return node.key
}
return null;
}
//搜索一个特定的值
this.search = function(key){
return searchNode(root,key);
}
var searchNode = (node,key) =>{
if(node === null){
return false;
}
if(key < node.key){
return searchNode(node.left,key)
} else if( key > node.key){
return searchNode(node.right,key);
}else{
return true;
}
}
//移除一个节点
this.remove = function(key){
return removeNode(root,key);
}
var removeNode = (node,key) =>{
if(node === null){
return false
}
if(key < node.key){
node.left = removeNode(node.left,key);
return node
}else if(key > node.key){
node.right = removeNode(node.right,key);
return node;
}else{
//第一种情况 一个叶子节点
if(node.left === null && node.right === null){
node = null;
return node;
}
//第二种情况 一个只有一个子节点的节点
if(node.left === null){
node = node.right;
return node;
}else if(node.right === null){
node = node.left;
return node;
}
//第三种情况 一个有两个子节点的节点
var aux = findMinNode(node.right);
node.key = aux.key;
node.right = removeNode(node.right,aux.key);
return node;
}
}
var findMinNode = (node)=>{
if(node){
while(node && node.left !== null){
node = node.left;
}
return node
}
return null;
}
}
let node = [8,3,10,1,6,14,4,7,13];
var binaryTree = new BinaryTree();
node.forEach((key)=>{
binaryTree.insert(key);
})
var printNode = (val) => {
console.log(val)
}
binaryTree.inOrderTraverse(printNode) //中序遍历
binaryTree.preOrderTraverse(printNode) //先序遍历
binaryTree.postOrderTraverse(printNode) //后序遍历
console.log(binaryTree.min() + ': min')
console.log(binaryTree.max() + ': max')
console.log(binaryTree.search(8) + ': search')
console.log(binaryTree.remove(8) )
js数据结构与算法——二叉树的更多相关文章
- JS数据结构与算法 - 二叉树(一)基本算法
仅供JavaScript刷题参考用. 二叉查找树和平衡二叉树 其它树:满二叉树.完全二叉树.完美二叉树.哈弗曼树.二叉查找树BST.平衡二叉树AVL 了解:红黑树,是一种特殊的二叉树.这种树可以进行高 ...
- javascript数据结构与算法-- 二叉树
javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...
- javascript数据结构与算法---二叉树(删除节点)
javascript数据结构与算法---二叉树(删除节点) function Node(data,left,right) { this.data = data; this.left = left; t ...
- javascript数据结构与算法---二叉树(查找最小值、最大值、给定值)
javascript数据结构与算法---二叉树(查找最小值.最大值.给定值) function Node(data,left,right) { this.data = data; this.left ...
- javascript数据结构与算法--二叉树遍历(后序)
javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...
- javascript数据结构与算法--二叉树遍历(先序)
javascript数据结构与算法--二叉树遍历(先序) 先序遍历先访问根节点, 然后以同样方式访问左子树和右子树 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
- javascript数据结构与算法--二叉树遍历(中序)
javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
- JS数据结构与算法——栈
JS数据结构与算法--栈 1.栈结构概念 栈(Stack)是一种先进后出(LIFO Last in First out)的线性表,先进栈的将会比后进栈的先出栈. 栈的限制是仅允许在一端进行插入和删除运 ...
- JS数据结构与算法-概述
JS数据结构与算法概述 数据结构: 计算机存储, 组织数据的方式, 就像锅碗瓢盆 算法: 一系列解决问题的清晰指令, 就像食谱 两者关系: 程序 = 数据结构 + 算法 邂逅数据结构与算法 什么是数据 ...
随机推荐
- Django(八)下:Model操作和Form操作、序列化操作
二.Form操作 一般会创建forms.py文件,单独存放form模块. Form 专门做数据验证,而且非常强大.有以下两个插件: fields :验证(肯定会用的) widgets:生成HTML(有 ...
- Django1-HTTP协议介绍
何为http协议(Hypertext Transfer Protocol,超文本传输协议)? 所谓协议,就是指双方遵循的规范.http协议,就是浏览器和服务器之间进行“沟通”的一种规范.我们在看空间, ...
- spring事物与传播行为
一.事物的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 作用:事物就是保证数据的一致性 事物的特性:事务必须服从ISO/IEC所制定的ACID原则.ACID是原 ...
- IntellIJ IDEA 配置 Maven 以及 修改 默认 Repository
转自:IntellIJ IDEA 配置 Maven 以及 修改 默认 Repository 今天将IntellIJ IDEA 关于Maven的配置总结一下,方便以后可参考. IDEA版本: Intel ...
- Spring Boot 2.x 编写 RESTful API (一) RESTful API 介绍 & RestController
用Spring Boot编写RESTful API 学习笔记 RESTful API 介绍 REST 是 Representational State Transfer 的缩写 所有的东西都是资源,所 ...
- ubuntu配置ssh连接方式
pgadmin4 配置界面的password指的是数据库用户的密码, 不是服务器的密码. pg数据库 1.确保远程服务器开放相应端口.这个是在防火墙设置. 2.pg数据库服务器允许外部ip访问, 默认 ...
- Flex布局【弹性布局】学习
先让我们看看在原来的学习中遇到的问题 之前在软件工程的大作业中,自己从零开始学习如何开发一个网站,从页面,到后台,当然数据库是大二的必修课 在学习如何编写一个静态页面的时候,完全是自学,自己摸索,所以 ...
- MySql自动备份shell
MySql黑屏备份是每个运维工程师必备的技能,以下是MySQL自动备份脚本: #/bin/bash#This is mysql backup shell on 2019/4/28 BAKUP_DIR= ...
- POJ 1848 Tree 树形DP
题目大意: 给出一棵树,现在要往这棵树上加边,使得所有的点都在环中,且每个点只能属于一个环 题解: 考虑DP: \(dp[i][0]\)表示使\(i\)这颗子树的每个点都在环内需要加的最少边数. \( ...
- 树莓派wiringPi,BCM,BOARD编码对应管脚
wiringPi,BCM,BOARD编码 由于上课需要, 嵌入式学习从树莓派开始 树莓派中执行: $> gpio readall 即可得到关于树莓派管脚的各种信息 上面的图可能不是特别清楚, 可 ...