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 相关文章推荐
document.all还是document.getElementsByName?
Jul 21 Javascript
有一段有意思的代码-javascript现实多行信息
Aug 26 Javascript
JavaScript中两种链式调用实现代码
Jan 12 Javascript
25个好玩的JavaScript小游戏分享
Apr 22 Javascript
在JS中解析HTML字符串示例代码
Apr 16 Javascript
分享Bootstrap简单表格、表单、登录页面
Aug 04 Javascript
Node.js简单入门前传
Aug 21 Javascript
详解Nuxt.js Vue服务端渲染摸索
Feb 08 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
Mar 09 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
Apr 10 Javascript
vue 实现搜索的结果页面支持全选与取消全选功能
May 10 Javascript
JavaScript实现简易聊天对话框(加滚动条)
Feb 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
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
收藏的一个php小偷的核心程序
2007/04/09 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
PHP中防止SQL注入实现代码
2011/02/19 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
php实现的验证码文件类实例
2015/06/18 PHP
html读出文本文件内容
2007/01/22 Javascript
Jquery Validate 正则表达式实用验证代码大全
2013/08/23 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
js注入 黑客之路必备!
2016/09/14 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
2018/03/26 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
TensorFlow 滑动平均的示例代码
2018/06/19 Python
Numpy中的mask的使用
2018/07/21 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
Python 实现try重新执行
2019/12/21 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
基于python实现简单C/S模式代码实例
2020/09/14 Python
Expedia西班牙:预订酒店、机票、旅行和廉价度假套餐
2019/04/10 全球购物
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
Javascript如何发送一个Ajax请求
2015/01/26 面试题
工程承包协议书范本
2014/09/29 职场文书
销售工作决心书
2015/02/04 职场文书
启迪人心的励志语录:脾气永远不要大于本事
2020/01/02 职场文书
如何利用Matlab制作一款真正的拼图小游戏
2021/05/11 Python
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android
使用Postman测试需要授权的接口问题
2022/06/21 Java/Android