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 相关文章推荐
谷歌浏览器 insertCell与appendChild的区别
Feb 12 Javascript
利用javascript判断文件是否存在
Dec 31 Javascript
最简单的JavaScript图片轮播代码(两种方法)
Dec 18 Javascript
javascript中FOREACH数组方法使用示例
Mar 01 Javascript
JS DOM实现鼠标滑动图片效果
Sep 17 Javascript
基于javascript实现简单的抽奖系统
Apr 15 Javascript
JavaScript实现弹出广告功能
Mar 30 Javascript
jQuery+pjax简单示例汇总
Apr 21 jQuery
微信小程序开发之toast等弹框提示使用教程
Jun 08 Javascript
详解基于webpack2.x的vue2.x的多页面站点
Aug 21 Javascript
js中怎么判断两个字符串相等的实例
Jan 17 Javascript
微信小程序实现传递多个参数与事件处理
Aug 12 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中显示格式化的用户输入
2006/10/09 PHP
PHP实现的方程求解示例分析
2016/11/11 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
2020/10/20 PHP
php中使用array_filter()函数过滤数组实例讲解
2021/03/03 PHP
jQuery Clone Bug解决代码
2010/12/22 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
基于jQuery实现的旋转彩圈实例
2015/06/26 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
2019/06/25 Javascript
微信小程序 拍照或从相册选取图片上传代码实例
2019/08/28 Javascript
JavaScript实现简单的计算器
2020/01/16 Javascript
[33:42]LGD vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
Python中规范定义命名空间的一些建议
2016/06/04 Python
详谈Python高阶函数与函数装饰器(推荐)
2017/09/30 Python
Pytoch之torchvision.transforms图像变换实例
2019/12/30 Python
Python datetime 格式化 明天,昨天实例
2020/03/02 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
PHP面试题及答案一
2012/06/18 面试题
小学家长评语大全
2014/04/16 职场文书
爱心捐款倡议书范文
2014/05/12 职场文书
2015年骨干教师工作总结
2015/05/26 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
2015年七夕情人节感言
2015/08/03 职场文书
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL