JS二叉树的简单实现方法示例


Posted in Javascript onApril 05, 2017

本文实例讲述了JS二叉树的简单实现方法。分享给大家供大家参考,具体如下:

今天学习了一下 二叉树的实现,在此记录一下

简单的二叉树实现,并且实现升序和降序排序输出

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.inOrderDesc = inOrderDesc;//中序遍历(降序)
  this.preOrder = preOrder;//先序遍历
  this.postOrder = postOrder;//后续遍历
  this.getMin = getMin;//最大值
  this.getMax = getMax;//最小值
  this.find = find;//查找值
  this.remove = remove;//删除节点
  this.count = count;//获取节点数量
  function insert(data){
    //创建一个新的节点
    var newNode = new Node(data,null,null);
    //判断是否存在根节点,没有将新节点存入
    if(this.root == null){
      this.root = newNode;
    }else{
      //获取根节点
      var current = this.root;
      var parent;
      while(true){
        //将当前节点保存为父节点
        parent = current;
        //将小的数据放在左节点
        if(data < current.data){
          //获取当前节点的左节点
          //判断当前节点下的左节点是否有数据
          current = current.left;
          if(current == null){
            //如果没有数据将新节点存入当前节点下的左节点
            parent.left = newNode;
            break;
          }
        }else{
          current = current.right;
          if(current == null){
            parent.right = newNode;
            break;
          }
        }
      }
    }
  }
  function inOrder(node){
    var data = [];
    _inOrder(node,data);
    return data;
  }
  function inOrderDesc(node){
    var data = [];
    _inOrderDesc(node,data);
    return data;
  }
  function preOrder(node){
    var data = [];
    _preOrder(node,data);
    return data;
  }
  function postOrder(node){
    var data = [];
    _postOrder(node,data);
    return data;
  }
  function _inOrder(node,data){
    if(!(node == null)){
      _inOrder(node.left,data);
      data.push(node.show());
      _inOrder(node.right,data);
    }
  }
  function _inOrderDesc(node,data){
    debugger;
    if(!(node == null)){
      _inOrderDesc(node.right,data);
      data.push(node.show());
      _inOrderDesc(node.left,data);
    }
  }
  function _preOrder(node,data){
    if(!(node == null)){
      data.push(node.show());
      _preOrder(node.left,data);
      _preOrder(node.right,data);
    }
  }
  function _postOrder(node,data){
    if(!(node == null)){
      _postOrder(node.left,data);
      _postOrder(node.right,data);
      data.push(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(data == current.data){
        return current;
      }else if(data < current.data){
        current = current.left;
      }else{
        current = current.right;
      }
    }
    return null;
  }
  function getSmallest(node){
    var current = node;
    while(!(current.left == null)){
      current = current.left;
    }
    return current;
  }
  function remove(data){
    root = removeNode(this.root,data);
  }
  function removeNode(node,data){
    if(node == null){
      return null;
    }
    if(data == node.data){
      //如果没有只节点
      if(node.left == null && node.right){
        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;
    }
  }
  function count(){
    var counts = 0;
    var current = this.root;
    if(current == null){
      return counts;
    }
    return _count(current,counts);
  }
  function _count(node,counts){
    debugger;
    if(!(node == null)){
      counts ++;
      counts = _count(node.left,counts);;
      counts = _count(node.right,counts);
    }
    return counts;
  }
}

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

Javascript 相关文章推荐
js 强制弹出窗口代码研究-又一款代码
Mar 20 Javascript
JQUERY1.6 使用方法四 检测浏览器
Nov 23 Javascript
JavaScript常用验证函数实例汇总
Nov 25 Javascript
node.js中的fs.fsync方法使用说明
Dec 15 Javascript
JavaScript实现图片轮播的方法
Jul 31 Javascript
jQuery实现切换页面过渡动画效果
Oct 29 Javascript
JavaScript实现短信倒计时60s
Oct 09 Javascript
详解JavaScript中typeof与instanceof用法
Oct 24 Javascript
如何在微信小程序中存setStorage
Dec 13 Javascript
JavaScript onclick事件使用方法详解
May 15 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
Jul 17 Javascript
关于JS中的作用域中的问题思考分享
Apr 06 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
Apr 05 #Javascript
js获取指定时间的前几秒
Apr 05 #Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
Apr 05 #Javascript
webpack2.0搭建前端项目的教程详解
Apr 05 #Javascript
详解使用fetch发送post请求时的参数处理
Apr 05 #Javascript
详解用webpack2.0构建vue2.0超详细精简版
Apr 05 #Javascript
关于vuex的学习实践笔记
Apr 05 #Javascript
You might like
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
php读取3389的脚本
2014/05/06 PHP
19个Android常用工具类汇总
2014/12/30 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
DOM 事件流详解
2015/01/20 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
2015/09/10 Javascript
jQuery检测滚动条是否到达底部
2015/12/15 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
关于微信jssdk实现多图片上传的一点心得分享
2016/12/13 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
vue2 前端搜索实现示例
2018/02/26 Javascript
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
JavaScript 几种循环方式以及模块化的总结
2020/09/03 Javascript
利用PHP实现递归删除链表元素的方法示例
2020/10/23 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
通过Python 接口使用OpenCV的方法
2018/04/02 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
利用python-pypcap抓取带VLAN标签的数据包方法
2019/07/23 Python
pycharm 安装JPype的教程
2019/08/08 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
python爬虫可以爬什么
2020/06/16 Python
static函数与普通函数有什么区别
2015/12/25 面试题
应届毕业生求职信
2014/05/26 职场文书
大学生求职意向书
2015/05/11 职场文书
2015暑假社会调查报告
2015/07/13 职场文书
Mysql 如何实现多张无关联表查询数据并分页
2021/06/05 MySQL
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python