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入门教程(1) 什么是JS
Jan 31 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
Oct 11 Javascript
JS验证身份证有效性示例
Oct 11 Javascript
JavaScript中的连字符详解
Nov 28 Javascript
js 鼠标移动显示图片的简单实例
Dec 25 Javascript
提升PHP安全:8个必须修改的PHP默认配置
Nov 17 Javascript
全面解析Bootstrap布局组件应用
Feb 22 Javascript
JS实现图片放大缩小的方法
Feb 15 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
Jun 07 Javascript
vue cli 3.0 搭建项目的图文教程
May 17 Javascript
基于Vue的侧边目录组件的实现
Feb 05 Javascript
如何HttpServletRequest文件对象并储存
Aug 14 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下判断数组中是否存在相同的值array_unique
2008/03/25 PHP
php 读取shell管道传输过来的内容
2010/03/01 PHP
PHP静态文件生成类实例
2014/11/29 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
2016/03/23 PHP
用js实现的一个Flash滚动轮换显示图片代码生成器
2007/03/14 Javascript
javascript 实现简单的table排序及table操作练习
2012/12/28 Javascript
javascript数组的使用
2013/03/28 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
2013/12/18 Javascript
深入分析JQuery和JavaScript的异同
2014/10/23 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
JavaScript常用的弹出广告及背投广告实现方法
2015/02/06 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
js改变透明度实现轮播图的算法
2020/08/24 Javascript
js querySelector() 使用方法
2016/12/21 Javascript
vuejs指令详解
2017/02/07 Javascript
AngularJS中使用ngModal模态框实例
2017/05/27 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
python 查找字符串是否存在实例详解
2017/01/20 Python
用matplotlib画等高线图详解
2017/12/14 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
python 读取文件并替换字段的实例
2018/07/12 Python
python中yield的用法详解——最简单,最清晰的解释
2019/04/04 Python
python内存动态分配过程详解
2019/07/15 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
浅谈Python描述数据结构之KMP篇
2020/09/06 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
怎样有效的进行自我评价
2013/10/06 职场文书
仓库理货员岗位职责
2013/12/18 职场文书
九年级数学教学反思
2014/02/02 职场文书
班主任自我评价范文
2015/03/11 职场文书
社区服务理念口号
2015/12/25 职场文书