JavaScript数据结构——树(Tree)
概念和结构
- 树由若干节点组成。
- 每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树。
- 我们这里实现二叉搜索树。二叉搜索树,它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。
二叉搜索树的操作
二叉搜索树有七种常用操作,分别为
- 插入节点 insert(value)
- 查找节点 search(value)
- 移除节点 remove(value)
- 遍历节点 traverse(value)
- 获取最小值 min()
- 获取最大值 max()
- 获取根节点 getRoot()
JS实现二叉树
JS里面的树结构需要通过对象(object)来实现。
var Tree = function(){//辅助类function Node(value){this.value = value;this.left = null;this.right = null;}//根节点var root = null;//插入节点this.insert = function(value){var newNode = new Node(value);if(root === null){root = newNode;}else{insertNode(root , newNode);}}//插入节点需要用到的函数function insertNode(node , newNode){if(newNode.value > node.value){//往右走if(node.right === null){node.right = newNode;}else{insertNode(node.right , newNode);}}else if(newNode.value < node.value){//往左走if(node.left === null){node.left = newNode;}else{insertNode(node.left , newNode);}}}//查找节点this.search = function(value){return search(root , value);}function search(node , value){if(node === null){return null;}else{if(value > node.value){//向右走return search(node.right , value);}else if(value < node.value){//向左走return search(node.left , value);}else{//返回这个节点return node;}}}//移除节点this.remove = function(value){root = removeNode(root , value);}//移除节点需要用到的函数function removeNode(node , value){//如果节点为空,返回nullif(node === null){return null;}else{if(value > node.value){//向右走node.right = removeNode(node.right , value);return node;}else if(value < node.value){//向左走node.left = removeNode(node.left , value);return node;}else{//移除这个节点//叶节点 if(node.left === null && node.right === null){return null;}//只有一个子节点的节点if(node.left !== null && node.right === null){return node.left;}else if(node.left === null && node.right !== null){return node.right;}//有两个子节点的节点,将这个节点值替换为右侧子树最小子节点值var rightMinValue = findMinNode(node.right);node.value = rightMinValue;node.right = removeNode(node.right , rightMinValue);return node;}}}//移除节点函数需要用到的寻找最小子节点函数function findMinNode(node){if(node === null){return null;}else{while(node.left){node = node.left;}return node.value;}}//遍历节点this.traverse = function(callback){traverse(root , callback);}//遍历节点需要用到的函数function traverse(node , callback){//节点为空则返回if(node === null){return;}else{// callback(node.value); //前序遍历traverse(node.left , callback);// callback(node.value); //中序遍历traverse(node.right , callback);callback(node.value); //后序遍历} }//获取最小值this.min = function(){return min(root);}//获取最小值需要用到的函数function min(node){//树为空返回nullif(node === null){return null;}else{while(node.left){node = node.left;}return node.value;}}//获取最大值this.max = function(){return max(root);}//获取最大值需要用到的函数function max(node){//树为空返回nullif(node === null){return null;}else{while(node.right){node = node.right;}return node.value;}}//获取根节点this.getRoot = function(){return root;}
}
JavaScript数据结构——树(Tree)相关推荐
- JavaScript数据结构——树Tree
5.1 --简述 二叉树.AVL树.红黑树 根节点: 位于数顶部的节点: 内部节点: 存在子元素的节点: 外部节点: 没有子元素的节点: 树的深度: 节点的深度取决于它的祖先节点的数量: 树的高度: ...
- 数据结构树(Tree)详解
树(tree) 树(Tree)的基本概念 定义 树的结构 二叉树 二叉树的特点 满二叉树 完全二叉树 二叉查找树(Binary Search Tree - BST,又称二叉排序树.二叉搜索树) AVL ...
- JavaScript数据结构——树
文章目录 二叉树 二叉搜索树 insert() 树的遍历 中序 先序 后序 最小节点 最大节点 搜索指定值 一个树结构含有父子关系的节点,除了根节点外,每一个节点都一个父节点和0个或者多个子节点.如下 ...
- JavaScript 数据结构——树
概念 树是一种分层数据的抽象模型. 树的常用操作: 深度优先遍历 广度优先遍历 实现 JavaScript中没有树,但是可用Object和Array来构建树,如上图中的树可表示为: const tre ...
- 走进数据结构 - 树(Tree)的世界
前言: 树是各种数据结构中最重头戏的结构.树的各种分类及其子类的各种特征,也是在算法研究和实践中最有价值的学问.本人基于自己的学识和见闻,打算写一篇树的前世今生和树的大家族的介绍,由于 ...
- 数据结构 树(Tree)的基本知识
树形结构的基本概念 节点(node): 树上的每一个元素都是节点 根节点: 一棵树最顶端的节点称为根节点 每棵树最多有一个根节点 空树没有根节点 父节点: 与一个节点直接连接,并且在它的头上的节点即是 ...
- JAVA数据结构知识点,数据结构 树Tree 知识点总结 附Leetcode力扣练习题答案
先来明确下树的概念:明确的父子关系 正确的示例: 错误的示例: 几个名词: 节点:线两端的点即节点 根节点:无父节点的节点 叶子节点:无子节点的节点 几个概念: 高度:从下到上,从0计数,根节点最高 ...
- python tree结构_Python入门篇-数据结构树(tree)篇
Python入门篇-数据结构树(tree)篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.树概述 1>.树的概念 非线性结构,每个元素可以有多个前躯和后继 树是n(n& ...
- JavaScript数据结构与算法 - 树
1. 树数据结构 树是一种分层数据的抽象模型 树是一种非顺序的数据结构 树对于存储需要快速查找的数据非常有用 常见例子:如公司的组织架构图 树结构: 2. 二叉树和二叉搜索树 二叉树: 只能有左右两个 ...
最新文章
- 用友服务器整体迁移--数据库附加
- javascript 卸载事件(onunload)
- Robot Framework测试用例并行执行
- 火狐浏览器打印网页不全_武汉社保网上下载打印流程
- angular2 路由ajax,如何通过Javascript函数在Angular 2中实现AJAX
- PICT实现组合测试用例
- Git使用教程:最详细、最浅显、一文读懂Git常用操作!
- “最佳前任”!字节跳动给员工发春节红包,离职员工也有,最高6888元
- Codeforces 1041C(贪心+set)
- ffmpeg rtmp 推流错误WriteN, RTMP send error 10053 10038
- ios无痕埋点_掌握数据生命周期:初识数据埋点
- 联想X61-Xp系统重装Ubuntu21.10
- 微软改进的DSSM结构:
- sql server 2005 T-SQL ALTER SCHEMA (Transact-SQL)
- 通过路由器设置,不用IPTV盒子,局域网内、局域网外任意设备随时随地观看网络电视直播
- Photoshop CC 2017工具的使用
- 百度网址安全中心怎么取消拦截的详细解决办法
- 如何计算网站需要多大流量多大带宽
- Unity中使用插件在地形中制作道路
- Go入门案列1:实现一个家庭收支记账系统