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 suggest效果 自动完成实现代码分享
Feb 17 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
Feb 19 Javascript
javascript将DOM节点添加到文档的方法实例分析
Aug 04 Javascript
Javascript中的Prototype到底是什么
Feb 16 Javascript
javaScript给元素添加多个class的简单实现
Jul 20 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
Feb 07 Javascript
小程序云开发教程如何使用云函数实现点赞功能
May 18 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
Jul 26 Javascript
Javascript作用域和作用域链原理解析
Mar 03 Javascript
JS中==、===你分清楚了吗
Mar 04 Javascript
JS实现烟花爆炸效果
Mar 10 Javascript
JS精髓原型链继承及构造函数继承问题纠正
Jun 16 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
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
详解PHP数组赋值方法
2015/11/07 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
PHP实现的日历功能示例
2018/09/01 PHP
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
JS中关于事件处理函数名后面是否带括号的问题
2016/11/16 Javascript
jQuery实现ToolTip元素定位显示功能示例
2016/11/23 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
基于AngularJS实现的工资计算器实例
2017/06/16 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
从零学python系列之从文件读取和保存数据
2014/05/23 Python
python实现K最近邻算法
2018/01/29 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
如何在scrapy中集成selenium爬取网页的方法
2020/11/18 Python
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
尤为Wconcept中国官网:韩国设计师品牌服饰
2019/01/10 全球购物
车间组长岗位职责
2013/12/20 职场文书
七年级数学教学反思
2014/01/22 职场文书
国旗下的讲话演讲稿
2014/05/08 职场文书
求职信范文大全
2014/05/26 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
2015年新农合工作总结
2015/03/30 职场文书
2015年乡镇纪检工作总结
2015/04/22 职场文书
学习委员竞选稿
2015/11/20 职场文书
二年级数学教学反思
2016/02/16 职场文书