JS实现二叉查找树的建立以及一些遍历方法实现


Posted in Javascript onApril 17, 2017

二叉查找树是由节点和边组成的。

我们可以定义一个节点类Node,里面存放节点的数据,及左右子节点,再定义一个用来显示数据的方法:

//以下定义一个节点类
function Node(data,left,right){
  // 节点的键值
  this.data = data;
  // 左节点
  this.left = left;
  // 右节点
  this.right = left;
  // 显示该节点的键值
  this.show = show;
}
// 实现show方法
function show(){
  return this.data;
}

再定义一个二叉查找树类BST,该类中有定义树的根节点,初始化为null,然后定义插入节点的方法,还有一边遍历的方法:

// 二叉查找树BST
// 有一个节点属性,还有一些其他的方法,以下定义一个二叉查找树BST类
function BST(){
  // 根节点初始化为空
  this.root = null;
  // 方法
  // 插入
  this.insert = insert;
  // 中序遍历
  this.inorder = inorder;
  // 先序遍历
  this.preorder = preorder;
  // 后序遍历
  this.postorder = postorder;
}

//实现insert插入方法
function insert(data){
  // 创建一个节点保存数据
  var node = new Node(data,null,null);
  // 下面将节点node插入到树中
  // 如果树是空的,就将节点设为根节点
  if(!this.root){
    this.root = node;
  }else{ //树不为空
    // 判断插在父节点的左边还是右边
    // 所以先要保存一下父节点
    // var parent = this.root;
    var current = this.root;
    var parent;
    // 如果要插入的节点键值小于父节点键值,则插在父节点左边,
    // 前提是父节点的左边为空,否则要将父节点往下移一层,
    // 然后再做判断
    while(true){
      // data小于父节点的键值
      parent = current;
      if(data < parent.data){
        // 将父节点往左下移(插入左边)
        // parent = parent.left;
        current = current.left;
        // 如果节点为空,则直接插入
        if(!current){
          // !!!此处特别注意,如果就这样把parent赋值为node,也仅仅只是parent指向node,
          // 而并没有加到父元素的左边!!!根本没有加到树中去。所以要先记住父元素,再把当前元素加入进去
          parent.left = node;
          break;
        }      
      }else{ // 将父节点往右下移(插入右边)
        current = current.right;
        if(!current){
          parent.right = node;
          break;
        }
      }
    }

  }
} 

//实现inorder遍历方法(左中右)
function inorder(node){
  if(node){
    inorder(node.left);
    console.log(node.show());
    inorder(node.right);
  }
}

// 先序遍历(中左右)
function preorder(node){
  if(node){
    console.log(node.show());
    preorder(node.left);
    preorder(node.right);
  }
}

// 后序遍历(左右中)
function postorder(node){
  if(node){
    preorder(node.left);
    preorder(node.right);
    console.log(node.show());
  }
}

测试:

// 后序遍历(左右中)
function postorder(node){
  if(node){
    postorder(node.left);
    postorder(node.right);
    console.log(node.show());
  }
}

// 实例化一个BST树
var tree = new BST();
// 添加节点
tree.insert(30);
tree.insert(14);
tree.insert(35);
tree.insert(12);
tree.insert(17);
// 中序遍历
tree.inorder(tree.root);
// 先序遍历
tree.preorder(tree.root);
// 后序遍历
tree.postorder(tree.root);

 结果:

中序遍历:

JS实现二叉查找树的建立以及一些遍历方法实现

先序遍历:

JS实现二叉查找树的建立以及一些遍历方法实现

后序遍历:

JS实现二叉查找树的建立以及一些遍历方法实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中eval()函数和trim()去掉字符串左右空格应用
Feb 02 Javascript
Jquery validation remote 验证的缓存问题解决方法
Mar 25 Javascript
JavaScript获得指定对象大小的方法
Jul 01 Javascript
jQuery.uploadify文件上传组件实例讲解
Sep 23 Javascript
让div运动起来 js实现缓动效果
Jul 06 Javascript
angular中实现li或者某个元素点击变色的两种方法
Jul 27 Javascript
jQuery实现的页面弹幕效果【测试可用】
Aug 17 jQuery
vue router 用户登陆功能的实例代码
Apr 24 Javascript
vue点击当前路由高亮小案例
Sep 26 Javascript
微信小程序实现侧边分类栏
Oct 21 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
Aug 20 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
Oct 29 Javascript
简单的JS控制button颜色随点击更改的实现方法
Apr 17 #Javascript
jQuery实现动态生成表格并为行绑定单击变色动作的方法
Apr 17 #jQuery
Vue分页组件实例代码
Apr 17 #Javascript
浅谈react.js 之 批量添加与删除功能
Apr 17 #Javascript
react.js 获取真实的DOM节点实例(必看)
Apr 17 #Javascript
老生常谈jacascript DOM节点获取
Apr 17 #Javascript
老生常谈combobox和combotree模糊查询
Apr 17 #Javascript
You might like
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
php实现的http请求封装示例
2016/11/08 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
JS input 数字验证代码
2009/07/30 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
bootstrap+spring boot实现面包屑导航功能(前端代码)
2019/10/09 Javascript
基于vue+echarts数据可视化大屏展示的实现
2020/12/25 Vue.js
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
python里将list中元素依次向前移动一位
2014/09/12 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
2016/12/27 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
2020/05/27 Python
商务日语毕业生自荐信范文
2013/11/14 职场文书
新驾驶员个人自我评价
2014/01/03 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
开学典礼策划方案
2014/05/28 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
企业百日安全活动总结
2015/05/07 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
演讲稿之开卷有益
2019/08/07 职场文书
SQLServer2019 数据库环境搭建与使用的实现
2021/04/08 SQL Server
详解CocosCreator项目结构机制
2021/04/14 Javascript
Python中的turtle画箭头,矩形,五角星
2022/03/16 Python