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 相关文章推荐
ExtJS 2.0 实用简明教程之布局概述
Apr 29 Javascript
js href的用法
May 13 Javascript
JavaScript中__proto__与prototype的关系深入理解
Dec 04 Javascript
动态标签 悬停效果 延迟加载示例代码
Nov 21 Javascript
基于Bootstrap的UI扩展 StyleBootstrap
Jun 17 Javascript
JS简单获取及显示当前时间的方法
Aug 03 Javascript
AngularJS中如何使用echart插件示例详解
Oct 26 Javascript
详解Vue用axios发送post请求自动set cookie
May 10 Javascript
AngularJS全局警告框实现方法示例
May 18 Javascript
你应该知道的几类npm依赖包管理详解
Oct 06 Javascript
生产制造追溯系统之再说条码打印
Jun 03 Javascript
小程序分享链接onShareAppMessage的具体用法
May 22 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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
PHP判断变量是否为0的方法
2014/02/08 PHP
Thinkphp实现MySQL读写分离操作示例
2014/06/25 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
js文本框输入内容智能提示效果
2015/12/02 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
2019/05/23 jQuery
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
[43:35]TI4 循环赛第二日Liquid vs Fnatic
2014/07/11 DOTA
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
详解PyTorch批训练及优化器比较
2018/04/28 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
详解python中的hashlib模块的使用
2019/04/22 Python
pycharm设置鼠标悬停查看方法设置
2019/07/29 Python
Python中pymysql 模块的使用详解
2019/08/12 Python
python实现密码强度校验
2020/03/18 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
2021/02/05 Python
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
eBay爱尔兰站:eBay.ie
2019/08/09 全球购物
what is the difference between ext2 and ext3
2015/08/25 面试题
英语国培研修感言
2014/02/13 职场文书
化工专业求职信
2014/07/01 职场文书
无私奉献演讲稿
2014/09/04 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js