JavaScript数据结构与算法之二叉树添加/删除节点操作示例


Posted in Javascript onMarch 01, 2019

本文实例讲述了JavaScript数据结构与算法之二叉树添加/删除节点操作。分享给大家供大家参考,具体如下:

function Node(data,left,right) {
  this.data = data;
  this.left = left;
  this.right = right;
  this.show = show;
}
function show() {
  return this.data;
}
function BST() {
  this.root = null;
  this.insert = insert;
  this.inOrder = inOrder;
  this.getMin = getMin;
  this.getMax = getMax;
  this.find = find;
  this.remove = remove;
}
function insert(data) {
  var n = new Node(data,null,null);
  if(this.root == null) {
    this.root = n;
  }else {
    var current = this.root;
    var parent;
    while(current) {
      parent = current;
      if(data < current.data) {
        current = current.left;
        if(current == null) {
          parent.left = n;
          break;
        }
      }else {
        current = current.right;
        if(current == null) {
          parent.right = n;
          break;
        }
      }
    }
  }
}
// 中序遍历
function inOrder(node) {
  if(!(node == null)) {
    inOrder(node.left);
    console.log(node.show());
    inOrder(node.right);
  }
}
// 先序遍历 
function preOrder(node) {
  if(!(node == null)) {
    console.log(node.show());
    preOrder(node.left);
    preOrder(node.right);
  }
}
// 后序遍历
function postOrder(node) {
  if(!(node == null)) {
    postOrder(node.left);
    postOrder(node.right);
    console.log("后序遍历"+node.show());
  }
}
// 二叉树查找最小值
function getMin(){
  var current = this.root;
  while(!(current.left == null)) {
    current = current.left;
  }
  return current.data;
}
// 二叉树上查找最大值
function getMax() {
  var current = this.root;
  while(!(current.right == null)) {
    current = current.right;
  }
  return current.data;
}
// 查找给定值
function find(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;
}
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;
    }
    // 有2个子节点的节点
    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;
  }
}
//代码初始化如下:
var nums = new BST();
nums.insert(23);
nums.insert(45);
nums.insert(16);
nums.insert(37);
nums.insert(3);
nums.insert(99);
nums.insert(22);
var min = nums.getMin();
console.log(min);
var max = nums.getMax();
console.log(max);
var value = nums.find("45");
console.log(value);
nums.remove(23);

运行结果:

JavaScript数据结构与算法之二叉树添加/删除节点操作示例

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
经过绑定元素时会多次触发mouseover和mouseout事件
Feb 28 Javascript
JQuery Mobile实现导航栏和页脚
Mar 09 Javascript
Bootstrap 粘页脚效果
Mar 28 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
Oct 14 Javascript
jQuery电话号码验证实例
Jan 05 Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
Aug 31 Javascript
详解vue2 $watch要注意的问题
Sep 08 Javascript
Electron + vue 打包桌面操作流程详解
Jun 24 Javascript
vue实现element表格里表头信息提示功能(推荐)
Nov 20 Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
Apr 27 Javascript
解决Vue watch里调用方法的坑
Nov 07 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
Mar 01 #Javascript
Angular7.2.7路由使用初体验
Mar 01 #Javascript
vuex实现及简略解析(小结)
Mar 01 #Javascript
简单两步使用node发送qq邮件的方法
Mar 01 #Javascript
Vue实现类似Spring官网图片滑动效果方法
Mar 01 #Javascript
[原创]微信小程序获取网络类型的方法示例
Mar 01 #Javascript
使用JavaScript解析URL的方法示例
Mar 01 #Javascript
You might like
php实现多张图片上传加水印技巧
2013/04/18 PHP
php提示Failed to write session data错误的解决方法
2014/12/17 PHP
yii 2.0中表单小部件的使用方法示例
2017/05/23 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
浅谈JavaScript的push(),pop(),concat()方法
2016/06/03 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
js中url对象化管理分析
2017/12/29 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
python学习手册中的python多态示例代码
2014/01/21 Python
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
Python实现快速计算词频功能示例
2018/06/25 Python
python计算两个数的百分比方法
2018/06/29 Python
总结python中pass的作用
2019/02/27 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
基于Python绘制个人足迹地图
2020/06/01 Python
Python生成随机验证码代码实例解析
2020/06/09 Python
OpenCV图片漫画效果的实现示例
2020/08/18 Python
CSS实现限制字数功能当对象内文本溢出时显示省略标记
2014/08/20 HTML / CSS
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
二年级数学教学反思
2014/01/21 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
奉献演讲稿范文
2014/05/21 职场文书
教研处工作方案
2014/05/26 职场文书
施工安全标语
2014/06/07 职场文书
贪污检举信范文
2015/03/02 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
学校远程教育工作总结
2015/08/11 职场文书