树是一种非线性的数据结构,以分层的方式存储数据。    二叉树:查找非常快,而且二叉树添加或者删除元素也非常快。    形象的可以描述为组织结构图,用来描述一个组织的结构。树是由边连接的点组成。树的一些基本概念:    根节点:一棵树最上面的节点。    父节点:一个节点下面连接多个节点,该节点是父节点。    子节点:父节点下面的节点。(一个节点可以有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--数据结构与算法之二叉树相关推荐

  1. javascript数据结构与算法--二叉树遍历(中序)

    javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /**二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中*** ...

  2. JavaScript数据结构与算法(2)(集合、字典、哈希表、二叉树、图)(ES6)

    注意:原教学视频:JavaScript(ES6)数据结构和算法 | JavaScript数据结构与算法 (都是CoderWhy老师的教学) 原作者(笔记)链接:JavaScript 数据结构与算法 | ...

  3. JavaScript数据结构和算法简述——前言

    为什么要使用数据结构和算法(程序=数据结构+算法)         数据结构是对在计算机内存中(有时在磁盘中)的数据的一种安排.包括数组.链表.栈.二叉树.哈希表等.        算法是对这些结构中 ...

  4. 学习JavaScript 数据结构与算法

    学习链接:https://github.com/XPoet/js-data-structures-and-algorithms JavaScript 数据结构与算法 1.数据结构(data struc ...

  5. 学习JavaScript数据结构与算法(一):栈与队列

    本系列的第一篇文章: 学习JavaScript数据结构与算法(一),栈与队列 第二篇文章:学习JavaScript数据结构与算法(二):链表 第三篇文章:学习JavaScript数据结构与算法(三): ...

  6. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  7. 常考数据结构与算法:输出二叉树的右视图

    题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...

  8. 为什么我要放弃javaScript数据结构与算法(第二章)—— 数组

    第二章 数组 几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构.JavaScript里也有数组类型,虽然它的第一个版本并没有支持数组.本章将深入学习数组数据结构和它的能力. 为什么 ...

  9. 数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡二叉树

    数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡而二叉树 目录 二叉树的序列化和反序列化 判断一棵树是否为平衡而二叉树 1. 二叉树的序列化和反序列化 1. 递归版本序列化和反序列化 代 ...

  10. 数据结构与算法之二叉树的先序遍历,中序遍历,后序遍历

    数据结构与算法之二叉树的先序遍历,中序遍历,后移遍历 目录 实现二叉树的先序,中序,后序遍历,包括递归方式和非递归方式 在二叉树中找到一个节点的后继节点 1. 实现二叉树的先序,中序,后序遍历,包括递 ...

最新文章

  1. POM.xml 标签详解
  2. 【v2.x OGE-example 第二章(第二节) 修改器的使用】
  3. Create Digital Engagement on Multiple Channels
  4. 【Django】orm继承AbstractUser表
  5. RxJava尝试取代Handler初探
  6. fedora 不在sudoers文件中_COPR 仓库中 4 个很酷的新软件(2019.4) | Linux 中国
  7. 区块链组织架构_区块链可以加速开放组织的5种方式
  8. 12.混淆——采样低频信号,采样高频信号_3
  9. Unity网络--HLAPI(1):服务器客户端变量同步,脏标识以及定制特性SyncVar
  10. 理解python的类实例化_理解python的类实例化
  11. 移动端app开发,原生开发与混合开发的区别
  12. HTML 表格表单代码实例(个人简介表)
  13. Nmap小技巧——探测大网络空间、局域网中的存活主机
  14. java常用的排序方法
  15. 盛德奇嘉提醒冬季对爱车养护全攻略:保养洗车均要注意
  16. php中$$代表什么意思
  17. 同步AOKP源码的方法
  18. linux企业实战-haproxy(2)动静分离
  19. php 微信表情存储,轻松处理PHP开发中微信emoji表情mysql存储的问题
  20. 服务器pytorch环境配置

热门文章

  1. java将ascii数组转成unicode字串
  2. POJ 1330 LCA最近公共祖先 离线tarjan算法
  3. Struts+Spring+Hibernate练习(完整)
  4. 有个需求mybatis 插入的时候不知道有哪些字段,需要动态的传入值和字段
  5. oracle表空间不足
  6. 方差,协方差 、统计学的基本概念
  7. 携手助力新型智慧城市建设和科技创新发展
  8. TCP/IP TELNET SSH
  9. 学习笔记之-------UIScrollView 基本用法 代理使用
  10. 信息安全系统设计基础第十一周 20135218 姬梦馨