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 相关文章推荐
Javascript SHA-1:Secure Hash Algorithm
Dec 20 Javascript
javascript 一些用法小结
Sep 11 Javascript
Node.js(安装,启动,测试)
Jun 09 Javascript
JavaScript电子时钟倒计时第二款
Jan 10 Javascript
arcgis for js 修改infowindow样式的方法
Nov 02 Javascript
微信小程序网络请求的封装与填坑之路
Apr 01 Javascript
jquery dataTable 获取某行数据
May 05 jQuery
基于AngularJS的拖拽文件上传的实例代码
Jul 15 Javascript
详解用Node.js实现Restful风格webservice
Sep 29 Javascript
详解vue中axios请求的封装
Apr 08 Javascript
使用Layui搭建后台管理界面的操作方法
Sep 20 Javascript
uniapp与webview之间的相互传值的实现
Jun 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
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
php实现的http请求封装示例
2016/11/08 PHP
javawscript 三级菜单的实现原理
2009/07/01 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
微信小程序获取用户openid的实现
2018/12/24 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
python删除列表中重复记录的方法
2015/04/28 Python
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
python函数局部变量用法实例分析
2015/08/04 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
Python+matplotlib+numpy绘制精美的条形统计图
2018/01/02 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
flask框架实现连接sqlite3数据库的方法分析
2018/07/16 Python
将python文件打包成EXE应用程序的方法
2019/05/22 Python
在windows下使用python进行串口通讯的方法
2019/07/02 Python
python画图--输出指定像素点的颜色值方法
2019/07/03 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
配置python的编程环境之Anaconda + VSCode的教程
2020/03/29 Python
管理心得体会
2013/12/28 职场文书
会计专业职业规划:规划自我赢取未来
2014/02/12 职场文书
中餐厅经理岗位职责
2014/04/11 职场文书
2015年街道办事处工作总结
2015/05/22 职场文书
教育读书笔记
2015/07/02 职场文书
浅谈怎么给Python添加类型标注
2021/06/08 Python
SQL中的三种去重方法小结
2021/11/01 SQL Server