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运行时库属性一览表
Mar 14 Javascript
jQuery实现流动虚线框的方法
Jan 29 Javascript
javascript 数组操作详解
Jan 29 Javascript
javascript中mouseover、mouseout使用详解
Jul 19 Javascript
Javascript 正则表达式校验数字的简单实例
Nov 02 Javascript
使用node.js中的Buffer类处理二进制数据的方法
Nov 26 Javascript
利用js获取下拉框中所选的值
Dec 01 Javascript
JavaScript动态加载重复绑定问题
Apr 01 Javascript
vant(ZanUi)结合async-validator实现表单验证的方法
Dec 06 Javascript
微信小程序实现简易table表格
Jun 19 Javascript
Javascript实现一朵从含苞到绽放的玫瑰
Mar 30 Javascript
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
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
基于mysql的论坛(6)
2006/10/09 PHP
PHP UTF8中文字符截断函数代码
2012/09/11 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
2016/11/05 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
繁简字转换功能
2006/07/19 Javascript
jQuery最佳实践完整篇
2011/08/20 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
快速掌握Node.js之Window下配置NodeJs环境
2016/03/21 NodeJs
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
js实现多行文本框统计剩余字数功能
2017/03/28 Javascript
jquery实现tab键进行选择后enter键触发click行为
2017/03/29 jQuery
vue异步加载高德地图的实现
2018/06/19 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
vue 搭建后台系统模块化开发详解
2019/05/01 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
[03:41]DOTA2上海特锦赛小组赛第三日recap精彩回顾
2016/02/28 DOTA
Python实现Mysql数据库连接池实例详解
2017/04/11 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
Python中max函数用于二维列表的实例
2018/04/03 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
使用Selenium破解新浪微博的四宫格验证码
2018/10/19 Python
聊聊python中的循环遍历
2020/09/07 Python
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
手机配件第一品牌:ZAGG
2017/05/28 全球购物
JPA的优势都有哪些
2013/07/04 面试题
财务会计专业应届毕业生求职信
2013/10/18 职场文书
给实习单位的感谢信
2014/02/01 职场文书
剪彩仪式主持词
2014/03/19 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
党员批评与自我批评
2014/10/15 职场文书
巧用 -webkit-box-reflect 倒影实现各类动效(小结)
2021/04/22 HTML / CSS
Django实现聊天机器人
2021/05/31 Python
Golang的继承模拟实例
2021/06/30 Golang