js数据结构之二叉树的详细实现方法
数据结构中,二叉树的使用频率非常高,这得益于二叉树优秀的性能。
二叉树是非线性的数据结构,用以存储带有层级的数据,其用于查找的删除的性能非常高。
二叉树 数据结构的实现方法如下:
- function Node (data, left, right) {
- this.data = data;
- this.left = left;
- this.right = right;
- this.show = function () {
- return this.data;
- };
- }
- function BST () {
- this.root = null;
- this.insert = function (data) {
- var node = new Node(data, null, null);
- if (this.root === null) {
- this.root = node;
- } else {
- var current = this.root;
- var parent;
- while (true) {
- parent = current;
- if (data < current.data) {
- current = current.left;
- if (current === null) {
- parent.left = node;
- break;
- }
- } else {
- current = current.right;
- if(current === null) {
- parent.right = node;
- break;
- }
- }
- }
- }
- };
- // 中序遍历
- this.inOrder = function (node) {
- if (node !== null) {
- this.inOrder(node.left);
- console.log(node.show());
- this.inOrder(node.right);
- }
- };
- // 先序遍历
- this.preOrder = function (node) {
- if (node !== null) {
- console.log(node.show());
- this.preOrder(node.left);
- this.preOrder(node.right);
- }
- };
- // 后序遍历
- this.afterOrder = function (node) {
- if (node !== null) {
- this.afterOrder(node.left);
- this.afterOrder(node.right);
- console.log(node.show());
- }
- };
- this.getMin = function () {
- var current = this.root;
- while (current.left !== null) {
- current = current.left;
- }
- return current.data;
- };
- this.getMax = function () {
- var current = this.root;
- while (current.right !== null) {
- current = current.right;
- }
- return current.data;
- };
- this.find = function (data) {
- var current = this.root;
- while (current !== null) {
- if (data < current.data) {
- current = current.left;
- } else if (data > current.data) {
- current = current.right;
- } else {
- return current;
- }
- }
- return null;
- };
- this.remove = function (data) {
- this.root = this._removeNode(this.root, data); //将根节点转换
- };
- this._getSmallest = function (node) {
- while(node.left!=null){
- node=node.left;
- }
- return node;
- };
- this._removeNode = function (node, data) {
- if (node === null) {
- return null;
- }
- if (data === node.data) {
- // 如果没有子节点
- if (node.right === null && node.left === null) {
- return null;
- }
- // 如果没有左子节点
- if (node.left === null) {
- return node.right;//直接指向其右节点
- }
- // 如果没有右子节点
- if (node.right === null) {
- return node.left;
- }
- // 如果有两个节点
- if (node.right !== null && node.left !== null) {
- var tempNode = this._getSmallest(node.right); // 找到最小的右节点
- node.data = tempNode.data;
- node.right = this._removeNode(node.right, tempNode.data); // 依次寻找
- return node;
- }
- } else if (data < node.data){
- node.left = this._removeNode(node.left, data);
- return node;
- } else {
- node.right = this._removeNode(node.right, data);
- return node;
- }
- };
- }
二叉树 数据结构的使用方法如下:
- var bst = new BST ();
- bst.insert(40);
- bst.insert(20);
- bst.insert(70);
- bst.insert(60);
- bst.insert(75);
- bst.insert(71);
- bst.insert(73);
- bst.inOrder(bst.root);
- bst.remove(70);
- console.log("----------------");
- bst.inOrder(bst.root);
- console.log("----------------");
- console.log(bst.find(73))
js数据结构之二叉树的详细实现方法的更多相关文章
- js数据结构之集合的详细实现方法
数据结构中的集合,类似于数学中常说的集合,是一类数据的群组.集合与集合之间还存在交集,并集,补集的运算. ***集合为无序,集合内元素不重复 ***js的set基于数组, 使用SetClass为类名, ...
- js数据结构之列表的详细实现方法
* 列表用于存放数据量较少的数据结构* 当数据量较大时,不需要对其进行查找.排序的情况下,使用列表也比较方便. 本数据结构在node环境下运行,需要对node有个基本是了解. 1. listSize: ...
- 如何发布一个自定义Node.js模块到NPM(详细步骤,附Git使用方法)
咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...
- 如何发布一个自定义Node.js模块到NPM(详细步骤)
咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...
- jquery jtemplates.js模板渲染引擎的详细用法第三篇
jquery jtemplates.js模板渲染引擎的详细用法第三篇 <span style="font-family:Microsoft YaHei;font-size:14px;& ...
- jquery jtemplates.js模板渲染引擎的详细用法第二篇
jquery jtemplates.js模板渲染引擎的详细用法第二篇 关于jtemplates.js的用法在第一篇中已经讲过了,这里就直接上代码,不同之处是绑定模板的方式,这里讲模板的数据专门写一个t ...
- jquery jtemplates.js模板渲染引擎的详细用法第一篇
jquery jtemplates.js模板渲染引擎的详细用法第一篇 Author:ching Date:2016-06-29 jTemplates是一个基于JQuery的模板引擎插件,功能强大,有了 ...
- js刷新页面有哪几种方法
js刷新页面有哪几种方法 一.总结 一句话总结:location属性的reload方法即可:document.location.reload() 1.页面刷新有哪常见的8种方法? 1,history. ...
- JS数据结构第三篇---双向链表和循环链表之约瑟夫问题
一.双向链表 在上文<JS数据结构第二篇---链表>中描述的是单向链表.单向链表是指每个节点都存有指向下一个节点的地址,双向链表则是在单向链表的基础上,给每个节点增加一个指向上一个节点的地 ...
随机推荐
- python - class类 (五) 继承补充-子类继承父类属性/函数方法
子类继承父类属性/函数方法: #方式一:(原生方式,不建议使用) class Dongwu(object): def __init__(self,name,sex,old): self.name = ...
- SpringBoot定制错误的Json数据
(1)自定义异常处理&返回定制Json数据 @ControllerAdvice public class MyExceptionHandler { @ResponseBody @Excepti ...
- linux kernel的cmdline参数解析原理分析【转】
转自:https://blog.csdn.net/skyflying2012/article/details/41142801 版权声明:本文为博主kerneler辛苦原创,未经允许不得转载. htt ...
- eclipse 反编译
Eclipse Class Decompiler安装此插件,可以编译源代码且调试
- java web path
1,request.getRealPath("/");这个方法已不推荐用 2,在Servlet 里用this.getServletContext().getRealPath(&qu ...
- 将本地光盘做成yum源
环境:vmware 1.将centos6.5光盘挂载在虚拟机上 2.将光盘挂载在/mnt/cdrom目录下 root# mkdir /mnt/cdrom root # mount /mnt/cdro ...
- lamp环境搭建之配置apache与fpm方式的php
配置apache-2.4.9与fpm方式的php-5.4.26 一.apache.MySQL的安装参考<编译安装lamp环境> http://blog.csdn.net/reblue520 ...
- 单点登录SSO+鉴权
一.单点登录原理 1.登录 2.注销 --------------------------------------------------------------------------------- ...
- [How to]HBase集群备份方法--Replication机制
1.简介 HBase备份的方法在[How to]HBase集群备份方法文章中已经有些介绍,但是这些方法都不是HBase本身的特性在支持,都是通过MR计算框架结合HBase客户端的方式,或者直接拷贝HB ...
- Ex 6_14 布料剪裁问题_第八次作业
子问题定义: 定义p[i][j]为布料宽为i,高为j的最优产出,每次剪下一块布料,剩余布料最多形成三块矩阵面料.每次剪裁会有两种情况,水平切割布料,其次是将布料旋转90度后在切割布料. 递归关系: 初 ...