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 相关文章推荐
判断是否输入完毕再激活提交按钮
Jun 26 Javascript
JSON扫盲帖 JSON.as类教程
Feb 16 Javascript
关于jQuery中.attr()和.prop()的问题探讨
Sep 06 Javascript
JSON格式化输出
Nov 10 Javascript
JS中字符串trim()使用示例
May 26 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
Jun 12 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
Jun 12 Javascript
jQuery1.9+中删除了live以后的替代方法
Jun 17 Javascript
Vue.js每天必学之过渡与动画
Sep 06 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
Mar 14 Javascript
vue的事件绑定与方法详解
Aug 16 Javascript
Vue实现图片轮播组件思路及实例解析
May 11 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
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
CodeIgniter生成网站sitemap地图的方法
2013/11/13 PHP
php解析url的三个示例
2014/01/20 PHP
php设置允许大文件上传示例代码
2014/03/10 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
JavaScript中的正则表达式简明总结
2014/04/04 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
2017/04/01 Javascript
javascript 作用于作用域链的详解
2017/09/27 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
javascript实现动态时钟的启动和停止
2020/07/29 Javascript
如何在Vue中抽离接口配置文件
2019/10/31 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
Python中的引用和拷贝浅析
2014/11/22 Python
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
python写入已存在的excel数据实例
2018/05/03 Python
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
Python Django简单实现session登录注销过程详解
2019/08/06 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
python打开文件的方式有哪些
2020/06/29 Python
详解python方法之绑定方法与非绑定方法
2020/08/17 Python
python FTP编程基础入门
2021/02/27 Python
全民健身日活动方案
2014/01/29 职场文书
应届毕业生自荐信例文
2014/02/26 职场文书
教师三严三实心得体会
2014/10/11 职场文书
2014年幼儿园工作总结
2014/11/10 职场文书
保研导师推荐信
2015/03/25 职场文书
2015年小学生国庆节演讲稿
2015/07/30 职场文书
Golang中异常处理机制详解
2021/06/08 Golang
Django rest framework如何自定义用户表
2021/06/09 Python