数据结构中,二叉树的使用频率非常高,这得益于二叉树优秀的性能。

二叉树是非线性的数据结构,用以存储带有层级的数据,其用于查找的删除的性能非常高。

二叉树 数据结构的实现方法如下:

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数据结构之二叉树的详细实现方法的更多相关文章

  1. js数据结构之集合的详细实现方法

    数据结构中的集合,类似于数学中常说的集合,是一类数据的群组.集合与集合之间还存在交集,并集,补集的运算. ***集合为无序,集合内元素不重复 ***js的set基于数组, 使用SetClass为类名, ...

  2. js数据结构之列表的详细实现方法

    * 列表用于存放数据量较少的数据结构* 当数据量较大时,不需要对其进行查找.排序的情况下,使用列表也比较方便. 本数据结构在node环境下运行,需要对node有个基本是了解. 1. listSize: ...

  3. 如何发布一个自定义Node.js模块到NPM(详细步骤,附Git使用方法)

    咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...

  4. 如何发布一个自定义Node.js模块到NPM(详细步骤)

    咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...

  5. jquery jtemplates.js模板渲染引擎的详细用法第三篇

    jquery jtemplates.js模板渲染引擎的详细用法第三篇 <span style="font-family:Microsoft YaHei;font-size:14px;& ...

  6. jquery jtemplates.js模板渲染引擎的详细用法第二篇

    jquery jtemplates.js模板渲染引擎的详细用法第二篇 关于jtemplates.js的用法在第一篇中已经讲过了,这里就直接上代码,不同之处是绑定模板的方式,这里讲模板的数据专门写一个t ...

  7. jquery jtemplates.js模板渲染引擎的详细用法第一篇

    jquery jtemplates.js模板渲染引擎的详细用法第一篇 Author:ching Date:2016-06-29 jTemplates是一个基于JQuery的模板引擎插件,功能强大,有了 ...

  8. js刷新页面有哪几种方法

    js刷新页面有哪几种方法 一.总结 一句话总结:location属性的reload方法即可:document.location.reload() 1.页面刷新有哪常见的8种方法? 1,history. ...

  9. JS数据结构第三篇---双向链表和循环链表之约瑟夫问题

    一.双向链表 在上文<JS数据结构第二篇---链表>中描述的是单向链表.单向链表是指每个节点都存有指向下一个节点的地址,双向链表则是在单向链表的基础上,给每个节点增加一个指向上一个节点的地 ...

随机推荐

  1. c++ 引用方式传递数组

    值传递 (pass by value),指针传递(pass by pointer),当发生函数调用时,需要给形参分配存储单元.当传递是对象时,要调用拷贝构造函数.而且指针最后析构时,要处理内存释放问题 ...

  2. 注解图Annotation

    该图来源于 竹子-博客(.NET/Java/Linux/架构/管理/敏捷) http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html,感 ...

  3. 容器平台选型的十大模式:Docker、DC/OS、K8S 谁与当先?【转】

    网易企业服务2017-10-13 无论是在社区,还是在同客户交流的过程中,总会被问到到底什么时候该用 Docker?什么时候用虚拟机?如果使用容器,应该使用哪个容器平台? 显而易见,我不会直接给大家一 ...

  4. rem布局加载闪烁问题

    说明:以下内容来自CSDN,如有侵权,请立刻联系博主(我),我将删除该内容. 原文链接  https://blog.csdn.net/u013778905/article/details/779387 ...

  5. STM32应用实例十:简析STM32 I2C通讯死锁问题

    I2C接口是一种使用非常普遍的MCU与外部设备的接口方式,在STM32中也集成了I2C接口,我们也常常使用它来与外围的传感器等设备通讯. 最近在我们使用STM32F1VET6读取压力和温湿度传感器数据 ...

  6. 测试开发之Django——No6.Django模板中的标签语言

    模板中的标签语言 1.if/else {% if  %} 标签检查(evaluate)一个变量,如果这个变量为真(即:变量存在,非空,不是布尔值假),系统会显示在{% if  %} 和 {% endi ...

  7. LeetCode(4):两个排序数组的中位数

    Hard! 题目描述: 有两个大小为 m 和 n 的排序数组 nums1 和 nums2 . 请找出两个排序数组的中位数并且总的运行时间复杂度为 O(log (m+n)) . 示例 1: nums1 ...

  8. 【ES】学习6-多字段搜索1

    本系列的笔记都来自:https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/multi-field-search.html 下 ...

  9. 洛谷p1072 gcd,质因数分解

    /* 可以得a>=c,b<=d,枚举d的质因子p 那么a,b,c,d,x中包含的p个数是ma,mb,mc,md,mx 在gcd(a,x)=c中 ma<mc => 无解 ma=m ...

  10. git填坑笔记

    Counting objects: 3, done.Writing objects: 100% (3/3), 203 bytes | 0 bytes/s, done.Total 3 (delta 0) ...