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通过RegExp实现客户端验证处理程序
May 07 Javascript
jquery validate在ie8下的bug解决方法
Nov 13 Javascript
jQuery实现预加载图片的方法
Mar 17 Javascript
angular基于路由控制ui-router实现系统权限控制
Sep 27 Javascript
js学习笔记之事件处理模型
Oct 31 Javascript
BootStrap实现轮播图效果(收藏)
Dec 30 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
Jan 04 Javascript
原生JS与jQuery编写简单选项卡
Oct 30 jQuery
vue+iview写个弹框的示例代码
Dec 05 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
Feb 03 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
May 10 Javascript
Vue中的组件及路由使用实例代码详解
May 22 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 validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
让你的网站可编辑的实现js代码
2009/10/19 Javascript
JavaScript 组件之旅(二)编码实现和算法
2009/10/28 Javascript
在Ajax中使用Flash实现跨域数据读取的实现方法
2010/12/02 Javascript
JavaScript判断访问的来源是手机还是电脑,用的哪种浏览器
2013/12/12 Javascript
20条学习javascript的编程规范的建议
2014/11/28 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
2017/04/20 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
vue下拉列表功能实例代码
2018/04/08 Javascript
详解webpack4多入口、多页面项目构建案例
2018/05/25 Javascript
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
基于elementUI实现图片预览组件的示例代码
2019/03/31 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
python 中文乱码问题深入分析
2011/03/13 Python
Python中的类学习笔记
2014/09/23 Python
Python多线程编程(五):死锁的形成
2015/04/05 Python
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
工业自动化毕业生自荐信范文
2014/01/04 职场文书
怎样写演讲稿
2014/01/04 职场文书
普通简短的个人自我评价
2014/02/15 职场文书
哈弗商学院毕业生求职信
2014/02/26 职场文书
2016年教师节特级教师获奖感言
2015/12/09 职场文书
redis 限制内存使用大小的实现
2021/05/08 Redis
MySQL中IO问题的深入分析与优化
2022/04/02 MySQL
Python内置包对JSON文件数据进行编码和解码
2022/04/12 Python
GTX1660显卡搭配显示器推荐
2022/04/19 数码科技