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操作textarea方法集合封装(兼容IE,firefox)
Feb 22 Javascript
IE关闭时判断及AJAX注销案例学习
Feb 18 Javascript
js对table的td进行相同内容合并示例详解
Dec 27 Javascript
JavaScript Array对象详解
Mar 01 Javascript
基于jquery实现轮播焦点图插件
Mar 31 Javascript
jQuery中animate的几种用法与注意事项
Dec 12 Javascript
AngularJS入门教程一:路由用法初探
May 27 Javascript
vue 实现类似淘宝星级评分的示例
Mar 01 Javascript
vue使用原生js实现滚动页面跟踪导航高亮的示例代码
Oct 25 Javascript
详解vue-cli3开发Chrome插件实践
May 29 Javascript
Flutter实现仿微信底部菜单栏功能
Sep 18 Javascript
详解Vue中Axios封装API接口的思路及方法
Oct 10 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
解析PHP高效率写法(详解原因)
2013/06/20 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
2016/01/25 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
2016/12/22 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
jQuery插件zTree实现的多选树效果示例
2017/03/08 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
js根据json数据中的某一个属性来给数据分组的方法
2018/10/08 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
2019/01/08 Javascript
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
Python模块的加载讲解
2019/01/15 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
python pip源配置,pip配置文件存放位置的方法
2019/07/12 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
Python实现动态给类和对象添加属性和方法操作示例
2020/02/29 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
Python sorted对list和dict排序
2020/06/09 Python
浅谈Python中的字符串
2020/06/10 Python
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
优秀毕业生求职信范文
2014/01/02 职场文书
如何签定毕业生就业协议书
2014/09/28 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
工作时间调整通知
2015/04/24 职场文书
团日活动总结格式
2015/05/11 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书
Navicat for MySQL的使用教程详解
2021/05/27 MySQL
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android
java项目构建Gradle的使用教程
2022/03/24 Java/Android