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 相关文章推荐
JavaScript网页制作特殊效果用随机数
May 22 Javascript
js字符串转换成xml对象并使用技巧解读
Apr 18 Javascript
深入浅析react native es6语法
Dec 09 Javascript
JavaScript模拟鼠标右键菜单效果
Dec 08 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
Oct 24 Javascript
canvas学习之API整理笔记(二)
Dec 29 Javascript
解决vue-cli中stylus无法使用的问题方法
Jun 19 Javascript
Vue组件通信之Bus的具体使用
Dec 28 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
Mar 28 Javascript
layui实现二维码弹窗、并下载到本地的方法
Sep 25 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
Aug 03 Javascript
javascript实现点击按钮切换轮播图功能
Sep 23 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
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
Visual Studio中js调试的方法图解
2014/06/30 Javascript
详解参数传递四种形式
2015/07/21 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
2015/10/29 Javascript
浅谈JavaScript的push(),pop(),concat()方法
2016/06/03 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
2016/08/25 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
详解React中合并单元格的正确写法
2019/01/08 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
node创建Vue项目步骤详解
2020/03/06 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
Python 命令行非阻塞输入的小例子
2013/09/27 Python
Python中str is not callable问题详解及解决办法
2017/02/10 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
简单谈谈Python的pycurl模块
2018/04/07 Python
Python面向对象之类的定义与继承用法示例
2019/01/14 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
JupyterNotebook设置Python环境的方法步骤
2019/12/03 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
大学生个人自我鉴定
2013/12/03 职场文书
人事主管岗位职责范本
2013/12/04 职场文书
消防器材管理制度
2014/01/28 职场文书
工程采购员岗位职责
2014/03/09 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
毕业论文致谢格式模板
2015/05/14 职场文书
长江七号观后感
2015/06/11 职场文书
工作经历证明范本
2015/06/15 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang