JavaScript--数据结构与算法之二叉树
树是一种非线性的数据结构,以分层的方式存储数据。 二叉树:查找非常快,而且二叉树添加或者删除元素也非常快。 形象的可以描述为组织结构图,用来描述一个组织的结构。树是由边连接的点组成。树的一些基本概念: 根节点:一棵树最上面的节点。 父节点:一个节点下面连接多个节点,该节点是父节点。 子节点:父节点下面的节点。(一个节点可以有0,1,或者多个子节点) 叶子节点:没有任何子节点的节点。 路径:从一个节点到另一个节点的这一组边。 树的遍历:以某种特定顺序访问树中所有的节点。 树的分层:根节点是0层,它的子节点是第一层以此类推。 树的深度:书的层数就是深度。 键:每个节点都有一个与之相关的值。 二叉树和二叉查找树 二叉树:一种特殊的树,子节点不超过两个将子树节点的个数限定为2,可以写出高效的程序在树中插入、查找、删除数据。 左右节点:父节点的两个子节点。 二叉查找树:是一种特殊的二叉树,相对较小的节点存在左节点,较大的存在右节点。这一特性是的查找的效率很高。
1、实现二叉查找树: 又节点组成,定义的第一个对象是Node,和链表的Node对象相似。 Node对象既能保存保存数据,也能保存和其他节点链接(left,right),show()用来显示保存在节点中的数据。
function Node(data,left,right) {this.data = data;this.left = left;this.right = right;//this.show = show; }Node.prototype.show = function() {return this.data;};
二叉树的创建:binary search tree
二叉树的创建:binary search tree该类只有一个数据成员,表示二叉树查找树根节点的Node对象,初始化null;BST有一个insert()方法,用来插入新节点,有点复杂,首先创建一个Node对象,将对象传入该数据中。检查BST是否有根结点,如果没有则是新树,该节点是根节点。否则待插入节点不是根节点,需要遍历BST,找到插入的适当位置。该过程类似与遍历链表。用一个变量存储当前结点,一层层地遍历BST。进入BST以后,下一步就是决定将节点放在什么地方,找到正确的插入点。 1)设置根节点为当前节点。 2)如果待插入节点保存的数据小于当前节点,则设置新的当前节点为原节点的左节点;反之4) 3)如果当前节点的左节点为null,就将新的节点插入这个位置,退出循环;反之执行下一次循环。 4)设置新的当前节点为原节点的右节点。 5)如果当前节点的右节点为null,就将新的节点插入这个位置,推出循环;反之执行下一次循环;
function BST() {this.root = null;//this.insert = insert;this.preOrder = preOrder;//先序遍历this.inOrder = inOrder;//中序遍历this.postOrder = postOrder;//后序遍历 }BST.prototype.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;}}}}};
2、遍历二叉树 方式:先序,中序,后序。(都是以根为参照访问) 先序:先访问根节点,再以升序的方式访问左子树和右子树。 中序:以升序的方式访问左中右的次序。 后序:先访问叶子节点,从左子树到右子树再到根节点。
//先序遍历preOrderfunction preOrder (node) {if(!(node == null)) {console.log(node.show());preOrder(node.left);preOrder(node.right);}}//test...var bst = new BST();bst.insert(23);bst.insert(45);bst.insert(16);bst.insert(37);bst.insert(3);bst.insert(99);bst.insert(22);preOrder(bst.root);//中序遍历inOrderfunction inOrder (node) {if(!(node == null)) {inOrder(node.left);console.log(node.show());inOrder(node.right);}}console.log("--------------------");inOrder(bst.root);//后序遍历inOrderfunction postOrder (node) {if(!(node == null)) {postOrder(node.left);postOrder(node.right);console.log(node.show());}}console.log("--------------------");postOrder(bst.root);
//完整代码:
~(function() {function Node(data,left,right) {this.data = data;this.left = left;this.right = right;//this.show = show; }Node.prototype.show = function() {return this.data;};function BST() {this.root = null;//this.insert = insert;this.preOrder = preOrder;//先序遍历this.inOrder = inOrder;//中序遍历this.postOrder = postOrder;//后序遍历 }BST.prototype.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;}}}}};//先序遍历preOrderfunction preOrder (node) {if(!(node == null)) {console.log(node.show());preOrder(node.left);preOrder(node.right);}}//中序遍历inOrderfunction inOrder (node) {if(!(node == null)) {inOrder(node.left);console.log(node.show());inOrder(node.right);}}//后序遍历inOrderfunction postOrder (node) {if(!(node == null)) {postOrder(node.left);postOrder(node.right);console.log(node.show());}}})();
3、二叉树上的查找:
1)查找最小值;2)查找最大值;3)查找给定值。
最大最小值的查找比较简单,只要遍历到最左,最右即可。
BST.prototype.getMin = function() {var _current = this.root;while(!(_current.left == null)) {_current = _current.left;}return _current.data;};BST.prototype.getMax = function () {var _current = this.root;while(!(_current.right == null)) {_current = _current.right;}return _current.data;};console.log("-----------");console.log( bst.getMin() );console.log( bst.getMax() );
查找给定值:find(); 需要比较该值和当前节点上的值的大小。通过比较大小,确定左遍历还是右遍历。
BST.prototype.find = function(data) {var _current = this.root;while(_current != null) {if(_current.data == data) {return _current;}else if(data < _current.data) {_current = _current.left;}else{_current = _current.right;}}return null;//没找到返回null };console.log("-----------");console.log( bst.find(99) );
4、删除二叉查找树上的节点
删除操作相对复杂,分为三种情况
1)删除叶子节点(没有子节点的节点)2)删除只有一个子节点3)删除包含两个子节点
删除时要删除数据和删除节点。算法具体过程:先判断当前节点是否包含待删除的数据,如果包含则删除该节点。如果不包含则比较当前节点上的数据和待删除的数据(删除根节点)。如果不包含,则比较当前节点的数据和待删除的数据。如果待删除数据小于当前节点上的数据,则移至当前结点的左子树节点继续比较;如果大于当前节点上的数据,则移至当前节点的右子节点继续比较。叶子节:只需要将从父节点指向它的链接指向null;删除节点只包含一个子节点:原本只想他的节点就的做些调整,使其指向它的子节点。删除包含两个子节点:一种是查找待删除节点左子树上的最大值,要么查找其右子树上的最小值。这个过程有两个方法完成,一个删除数据remove();,一个删除节点removeNode();
function remove(data) {root = removeNode(this.root,data);}function getSmallest(node) {if (node.left == null) {return node;}else {return getSmallest(node.left);}}function removeNode(node,data) {if(node == null) {return null;}if(data == node.data) {if(node.left == null && node.right == null) {//叶子节点return null;}if(node.left == null) {//没有左子树return node.right;}if(node.right == null) {//没有右子树return node.left;}//有两个子节点的节点var _tempNode = getSmallest(node.right);//采用右子树上的最小值node.data = _tempNode.data;node.right = removeNode(node.right,_tempNode.data);return node;}else if(data < node.data) {node.left = removeNode(node.left,data);return node;}else {node.right = removeNode(node.right,data);return node;}}//bst.remove(3); preOrder(bst.root);//console.log( bst.show() );
转载于:https://www.cnblogs.com/intelwisd/p/7755534.html
JavaScript--数据结构与算法之二叉树相关推荐
- javascript数据结构与算法--二叉树遍历(中序)
javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /**二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中*** ...
- JavaScript数据结构与算法(2)(集合、字典、哈希表、二叉树、图)(ES6)
注意:原教学视频:JavaScript(ES6)数据结构和算法 | JavaScript数据结构与算法 (都是CoderWhy老师的教学) 原作者(笔记)链接:JavaScript 数据结构与算法 | ...
- JavaScript数据结构和算法简述——前言
为什么要使用数据结构和算法(程序=数据结构+算法) 数据结构是对在计算机内存中(有时在磁盘中)的数据的一种安排.包括数组.链表.栈.二叉树.哈希表等. 算法是对这些结构中 ...
- 学习JavaScript 数据结构与算法
学习链接:https://github.com/XPoet/js-data-structures-and-algorithms JavaScript 数据结构与算法 1.数据结构(data struc ...
- 学习JavaScript数据结构与算法(一):栈与队列
本系列的第一篇文章: 学习JavaScript数据结构与算法(一),栈与队列 第二篇文章:学习JavaScript数据结构与算法(二):链表 第三篇文章:学习JavaScript数据结构与算法(三): ...
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...
- 常考数据结构与算法:输出二叉树的右视图
题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...
- 为什么我要放弃javaScript数据结构与算法(第二章)—— 数组
第二章 数组 几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构.JavaScript里也有数组类型,虽然它的第一个版本并没有支持数组.本章将深入学习数组数据结构和它的能力. 为什么 ...
- 数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡二叉树
数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡而二叉树 目录 二叉树的序列化和反序列化 判断一棵树是否为平衡而二叉树 1. 二叉树的序列化和反序列化 1. 递归版本序列化和反序列化 代 ...
- 数据结构与算法之二叉树的先序遍历,中序遍历,后序遍历
数据结构与算法之二叉树的先序遍历,中序遍历,后移遍历 目录 实现二叉树的先序,中序,后序遍历,包括递归方式和非递归方式 在二叉树中找到一个节点的后继节点 1. 实现二叉树的先序,中序,后序遍历,包括递 ...
最新文章
- scroll-苹果滑动卡顿
- 32linux下安装mysql5.7_【Linux】【MySQL】安装MySQL,版本5.7
- 2005年个人防病毒软件评测报告
- 无限轮播的N+2 策略
- js堆和栈的区别_几个例子理解不同数据类型的堆栈内存处理
- JDK源码学习路线~每天学一点~每天进步一点点
- Adding Keyword And Description meta tags to each page by inheritence
- 【sql绕过】Bypass waf notepad of def
- android studio查看jar包源码,Android Studio查看源代码报错
- 96% 移动恶意软件针对 Android 系统:逾50亿应用可被攻击
- 关于MVC打印问题,打印指定的内容
- oracle中使用java存贮过程
- Android 圆角布局 shape.xml的使用
- java 防止超卖_实现防止超卖的几种方式
- 【技巧分享】【数据分析】数据分析模型
- PaddlePaddle笔记4-看图写诗
- 数据库第八周实验——第五章课后题
- A股上市公司财报披露时间
- 月经周期28天健康日历表
- Django项目实践(商城):十一、收货地址