删除操作需要考虑三种情况:

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实现二叉树添加节点,删除节点操作相关推荐

  1. JS中创建、添加、删除节点

    createElement():创建节点 appendChild():添加节点(还有一个很相似的 inertBefore():插入节点,两个参) removeChild():删除节点 <!DOC ...

  2. 如何在 SQL Server 2005 故障转移群集中添加或删除节点(安装程序)

    如何在 SQL Server 2005 故障转移群集中添加或删除节点(安装程序) 使用此过程管理 Microsoft SQL Server 2005 故障转移群集实例中的节点. 重要提示: 若要更新或 ...

  3. redis cluster如何添加和删除节点?

    文章目录 redis cluster如何增加和删除节点? 背景说明 添加节点 添加master节点 添加slave节点 删除节点 删除master节点 删除slave节点 redis cluster如 ...

  4. JavaScript学习笔记:创建、添加与删除节点

    JavaScript学习笔记:创建.添加与删除节点 文章目录 JavaScript学习笔记:创建.添加与删除节点 一.DOM对象节点类型 二.创建节点 1.创建元素节点 2.创建文本节点 3.创建属性 ...

  5. JS节点操作小结(创建节点,添加节点,获取节点,删除节点,复制节点)

    一,创建节点 document.createElement('li'),//创建一个节点 二,添加节点 insertBefore(要添加的节点, 添加在哪个节点之前) 在指定节点前面添加 三,获取节点 ...

  6. 【jQuery笔记Part4】01-jQuery-节点操作-添加节点-删除节点-复制节点

    节点操作 添加节点 静态页面 内部添加(父子关系) append(): 添加节点->追加到最后 (父子关系) appendTo(tag): 把创建的节点添加到指定节点之后(父子关系) prepe ...

  7. js添加多个子节点_js添加和删除节点, 方法调用是通过子节点中的节点来添加的呢。...

    html> new document 学号 姓名 操作 xh001 王小明 删除 xh002 刘小芳 删除 var table = document.getElementById("t ...

  8. 红黑树添加和删除节点原理

    红黑树添加和删除原理 一.概念 二.特性 三.应用 四.基本操作--插入 1.简介 2.插入规则 3.红黑树插入的4种情形 4.插入图例 五.基本操作--删除 1.红黑树删除的情形 2.插入图例 转载 ...

  9. js 用事件委托实现 删除节点

    用事件委托来处理子节点的相同点击事件的好处是 1.假如节点是动态生成的不需要在手动添加点击事件 2.不用循环遍历为每一个子节点添加点击事件 代码实现思路 // 获取父节点元素var nUls = do ...

  10. 二叉树C++ | 实现删除节点_4

    删除节点 /* Deleting a node from Binary search tree */ #include<iostream> using namespace std; str ...

最新文章

  1. ROS-3 : Catkin工作空间和ROS功能包
  2. tf.ConfigProto()详解
  3. ACF:让控制台程序变得更为简单
  4. java 内存空间_怎样用java实现存储空间动态分配
  5. VTK:Utilities之ReportRenderWindowCapabilities
  6. URAL 1033 Labyrinth
  7. python画子图_Python使用add_subplot与subplot画子图操作示例
  8. 输入输出Fibonacci数
  9. python学习日记(OOP——静态方法和类方法)
  10. 虚拟机linux启动是来宾账户,配置Openstack Nova以自动启动在主机重新引导之前运行的guest虚拟机...
  11. 多目标优化(三)简单的 MOEA/D
  12. 华为交换机设置端口镜像捕获数据包
  13. 25-Web-京东登录界面
  14. 微信小程序 - - 授权登录退出和缓存
  15. 内部基因决定拼购品质,苏宁拼购或将成为行业发展新标杆
  16. conda命令报错Collecting package metadata (repodata.json): failed
  17. java发送get请求400解决
  18. 考前集训 Day1下午
  19. 都说建议新手用3Dmax,那到底学好3Dmax要多久呢?
  20. p7za无root权限安装/7z linux安装

热门文章

  1. 王建农老师昆笛 + 简谱
  2. 业余时间你在做什么,你就会变成什么样的人?
  3. 一些相见恨晚的BurpSuite插件推荐
  4. Vue3+file-saver+xlsx 实现 excel 导出
  5. Appium和Python实现蚂蚁森林自动化收取能量
  6. flv.js播放报错
  7. python运势预测程序_运势.py · Scar/Python-Spider - Gitee.com
  8. IOS唤起键盘,移动端页面放大
  9. 网络工程属于计算机还是通信,通信工程属于计算机大类吗 哪个大类
  10. 【通俗易懂】机器学习中 L1 和 L2 正则化的直观解释