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方法和技巧大全
Dec 27 Javascript
在百度知道团队中快速审批新成员的js脚本
Feb 02 Javascript
jQuery中find()方法用法实例
Jan 07 Javascript
javascript中的Function.prototye.bind
Jun 25 Javascript
使用Javascript写的2048小游戏
Nov 25 Javascript
Javascript基础知识盲点总结之函数
May 15 Javascript
微信小程序 生命周期详解
Oct 12 Javascript
jQuery Easyui datagrid连续发送两次请求问题
Dec 13 Javascript
js以及jquery实现手风琴效果
Apr 17 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
Mar 21 Javascript
实例解析ES6 Proxy使用场景介绍
Jan 08 Javascript
JavaScript实现简易计算器小功能
Oct 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
php echo 输出字符串函数详解
2010/05/13 PHP
PHP学习笔记之一
2011/01/17 PHP
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
PHP函数超时处理方法
2016/02/14 PHP
使两个iframe的高度与内容自适应,且相等
2006/11/20 Javascript
从JavaScript的函数重名看其初始化方式
2007/03/08 Javascript
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
快速使用Bootstrap搭建传送带
2016/05/06 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
JavaScript实现倒计时跳转页面功能【实用】
2016/12/13 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
Angular2 路由问题修复详解
2017/03/01 Javascript
jQuery设计思想
2017/03/07 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
pandas进行数据的交集与并集方式的数据合并方法
2018/06/27 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
如何解决python多种版本冲突问题
2020/10/13 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
CSS3实现歌词进度文字颜色填充变化动态效果的思路详解
2020/06/02 HTML / CSS
办公室主任先进事迹
2014/01/18 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers
聊聊Lombok中的@Builder注解使用教程
2021/11/17 Java/Android