JS实现二叉树添加节点,删除节点操作
删除操作需要考虑三种情况:
1、删除叶子节点
2、删除只有一个孩子的节点
3、删除有2个子孩子的节点
由于1,2两个删除操作很简单,就详细解释一下第3种情况的删除操作,如下:
最难得操作就是下面四点,只要找到了下面四个节点,删除操作就游刃而解了
1、找到要删除的节点
2、找到要删除节点的父节点
3、找到要删除节点的前驱或后继节点(如下以找后继为例)
4、找到要删除的节点的前驱或后继节点的父节点(如下以找后继的父节点为例)
1和2,只需要对树进行遍历,定义一个delparent来每次存储遍历到得节点的前一个节点,这样便能在找到要删除节点的同时,找到要删除节点的父节点
//找到要删除的节点
var cur = this.root;
var delParent = null;
var delNode = null;
var isLeft = true;
while (cur.data != data) {delParent = cur;if (data < cur.data) {cur = cur.left;isLeft = true;} else {cur = cur.right;isLeft = false;}
}
delNode = cur;
同理找到3和4中的后继和后继节点的父节点
这里找后继相对比较简单,因为是找后继,所以要从删除节点的右孩子开始寻找,找出以右孩子为根节点的树中最小的那个节点(同理找前驱则是以左孩子为根节点的树中最大的那个节点),由于是找最小,所以一直遍历.left,就可以找出来了。
var backsuccussor = delNode.right;
var backsuccussorParent = delNode.right;
var backsuccussorRight = backsuccussor;
//寻找后继节点
while (backsuccussor.left != null) {backsuccussorParent = backsuccussor;backsuccussor = backsuccussor.left;
}
下面,我们来捋一捋替换思路
1、后继节点
2、后继节点父节点(因为是寻找后继节点,所以后继节点一定为其父节点的左孩子,而后继节点如果有孩子就一定是有孩子)
3、替换操作
4删除节点的父节点与操作后的节点拼接
以上操作均没有考虑删除节点是根节点的情况,但在我的完整代码中给出了删除节点是根节点的情况,如下是完整代码,可以直接引入到html中进行编译
function BSTree() {this.root = null;function Node(data) {this.data = data;this.left = null;this.right = null;}BSTree.prototype.insert = function(data) {var newNode = new Node(data);if (this.root == null) {this.root = newNode;} else {var cur = this.root;var pre = null;var isLeft = true;while (cur != null) {pre = cur;if (data < cur.data) {isLeft = true;cur = cur.left;} else {isLeft = false;cur = cur.right;}}if (isLeft) pre.left = newNode;else {pre.right = newNode;}}}BSTree.prototype.remove = function(data) {//找到要删除的节点var cur = this.root;var delParent = null;var delNode = null;var isLeft = true;while (cur.data != data) {delParent = cur;if (data < cur.data) {cur = cur.left;isLeft = true;} else {cur = cur.right;isLeft = false;}}delNode = cur;//删除的节点没有子孩子if (delNode.left == null && delNode.right == null) {if (delNode == this.root) {this.root = null;} else {if (isLeft) delParent.left = null;else {delParent.right = null;}}}//删除的节点有一个右子孩子else if (delNode.left == null && delNode.right != null) {if (delNode == this.root) {if (isLeft) this.root = delNode.right;else {this.root = delNode.left;}} else if (isLeft) delParent.left = delNode.right;else {delParent.right = delNode.right;}}//删除的节点有一个左子孩子else if (delNode.right == null && delNode.left != null) {if (delNode == this.root) {if (isLeft) this.root = delNode.right;else {this.root = delNode.left;}} else if (isLeft) delParent.left = delNode.left;else {delParent.right = delNode.left;}}//删除的节点有两个子孩子else {var backsuccussor = delNode.right;var backsuccussorParent = delNode.right;var backsuccussorRight = backsuccussor;//寻找后继节点while (backsuccussor.left != null) {backsuccussorParent = backsuccussor;backsuccussor = backsuccussor.left;}backsuccussorParent.left = backsuccussor.right;backsuccussor.right = delNode.right;backsuccussor.left = delNode.left;if (delNode == this.root) {this.root = backsuccussor;} else if (isLeft) {delParent.left = backsuccussor;} else {delParent.right = backsuccussor;}}}}var bst = new BSTree();bst.insert(8);bst.insert(10);bst.insert(5);bst.insert(15);bst.insert(13);bst.insert(2);bst.insert(17);bst.insert(11);bst.insert(12);bst.insert(9);bst.remove(10);// bst.remove(11);console.log(bst);
JS实现二叉树添加节点,删除节点操作相关推荐
- JS中创建、添加、删除节点
createElement():创建节点 appendChild():添加节点(还有一个很相似的 inertBefore():插入节点,两个参) removeChild():删除节点 <!DOC ...
- 如何在 SQL Server 2005 故障转移群集中添加或删除节点(安装程序)
如何在 SQL Server 2005 故障转移群集中添加或删除节点(安装程序) 使用此过程管理 Microsoft SQL Server 2005 故障转移群集实例中的节点. 重要提示: 若要更新或 ...
- redis cluster如何添加和删除节点?
文章目录 redis cluster如何增加和删除节点? 背景说明 添加节点 添加master节点 添加slave节点 删除节点 删除master节点 删除slave节点 redis cluster如 ...
- JavaScript学习笔记:创建、添加与删除节点
JavaScript学习笔记:创建.添加与删除节点 文章目录 JavaScript学习笔记:创建.添加与删除节点 一.DOM对象节点类型 二.创建节点 1.创建元素节点 2.创建文本节点 3.创建属性 ...
- JS节点操作小结(创建节点,添加节点,获取节点,删除节点,复制节点)
一,创建节点 document.createElement('li'),//创建一个节点 二,添加节点 insertBefore(要添加的节点, 添加在哪个节点之前) 在指定节点前面添加 三,获取节点 ...
- 【jQuery笔记Part4】01-jQuery-节点操作-添加节点-删除节点-复制节点
节点操作 添加节点 静态页面 内部添加(父子关系) append(): 添加节点->追加到最后 (父子关系) appendTo(tag): 把创建的节点添加到指定节点之后(父子关系) prepe ...
- js添加多个子节点_js添加和删除节点, 方法调用是通过子节点中的节点来添加的呢。...
html> new document 学号 姓名 操作 xh001 王小明 删除 xh002 刘小芳 删除 var table = document.getElementById("t ...
- 红黑树添加和删除节点原理
红黑树添加和删除原理 一.概念 二.特性 三.应用 四.基本操作--插入 1.简介 2.插入规则 3.红黑树插入的4种情形 4.插入图例 五.基本操作--删除 1.红黑树删除的情形 2.插入图例 转载 ...
- js 用事件委托实现 删除节点
用事件委托来处理子节点的相同点击事件的好处是 1.假如节点是动态生成的不需要在手动添加点击事件 2.不用循环遍历为每一个子节点添加点击事件 代码实现思路 // 获取父节点元素var nUls = do ...
- 二叉树C++ | 实现删除节点_4
删除节点 /* Deleting a node from Binary search tree */ #include<iostream> using namespace std; str ...
最新文章
- ROS-3 : Catkin工作空间和ROS功能包
- tf.ConfigProto()详解
- ACF:让控制台程序变得更为简单
- java 内存空间_怎样用java实现存储空间动态分配
- VTK:Utilities之ReportRenderWindowCapabilities
- URAL 1033 Labyrinth
- python画子图_Python使用add_subplot与subplot画子图操作示例
- 输入输出Fibonacci数
- python学习日记(OOP——静态方法和类方法)
- 虚拟机linux启动是来宾账户,配置Openstack Nova以自动启动在主机重新引导之前运行的guest虚拟机...
- 多目标优化(三)简单的 MOEA/D
- 华为交换机设置端口镜像捕获数据包
- 25-Web-京东登录界面
- 微信小程序 - - 授权登录退出和缓存
- 内部基因决定拼购品质,苏宁拼购或将成为行业发展新标杆
- conda命令报错Collecting package metadata (repodata.json): failed
- java发送get请求400解决
- 考前集训 Day1下午
- 都说建议新手用3Dmax,那到底学好3Dmax要多久呢?
- p7za无root权限安装/7z linux安装
热门文章
- 王建农老师昆笛 + 简谱
- 业余时间你在做什么,你就会变成什么样的人?
- 一些相见恨晚的BurpSuite插件推荐
- Vue3+file-saver+xlsx 实现 excel 导出
- Appium和Python实现蚂蚁森林自动化收取能量
- flv.js播放报错
- python运势预测程序_运势.py · Scar/Python-Spider - Gitee.com
- IOS唤起键盘,移动端页面放大
- 网络工程属于计算机还是通信,通信工程属于计算机大类吗 哪个大类
- 【通俗易懂】机器学习中 L1 和 L2 正则化的直观解释