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 相关文章推荐
网页里控制图片大小的相关代码
Jun 13 Javascript
Some tips of wmi scripting in jscript (1)
Apr 03 Javascript
解决表单中第一个非隐藏的元素获得焦点的一个方案
Oct 26 Javascript
原生javascript模仿win8等待提示圆圈进度条
Apr 24 Javascript
javascript设计模式之解释器模式详解
Jun 05 Javascript
Javascript基础教程之数据类型 (字符串 String)
Jan 18 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
Jan 22 Javascript
浅谈javascript中的DOM方法
Jul 16 Javascript
js获取页面及个元素高度、宽度的代码
Apr 26 Javascript
Vue 中的compile操作方法
Feb 26 Javascript
JS document form表单元素操作完整示例
Jan 13 Javascript
Vue基于iview table展示图片实现点击放大
Aug 05 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
一个程序下载的管理程序(一)
2006/10/09 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
PHP得到某段时间区间的时间戳 php定时任务
2012/04/12 PHP
深入解析fsockopen与pfsockopen的区别
2013/07/05 PHP
php编写简单的文章发布程序
2015/06/18 PHP
基于PHP如何把汉字转化为拼音
2015/12/11 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
jQuery中scrollTop()方法用法实例
2015/01/16 Javascript
基于JS设计12306登录页面
2016/12/28 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
Bootstrap导航简单实现代码
2017/03/06 Javascript
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
Vue axios设置访问基础路径方法
2018/09/19 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
webpack4 SplitChunks实现代码分隔详解
2019/05/23 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
微信小程序实现音频文件播放进度的实例代码
2020/03/02 Javascript
Vue Element校验validate的实例
2020/09/21 Javascript
详解python开发环境搭建
2016/12/16 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
Python 访问限制 private public的详细介绍
2018/10/16 Python
Pytorch释放显存占用方式
2020/01/13 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
2020/04/22 Python
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
BASIC HOUSE官方旗舰店:韩国著名的服装品牌
2018/09/27 全球购物
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
用Java语言将一个键盘输入的数字转化成中文输出
2013/01/25 面试题
工作疏忽检讨书
2014/01/25 职场文书
心理健康课教学反思
2014/02/13 职场文书
借款协议书范本
2014/04/22 职场文书
应届生自荐信
2014/06/30 职场文书
房贷工资证明范本
2015/06/12 职场文书
未婚证明格式
2015/06/15 职场文书