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滚动条多种样式,推荐
Feb 05 Javascript
jQuery前台数据获取实现代码
Mar 16 Javascript
JavaScript window.document的属性、方法和事件小结
Oct 24 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
Jan 25 Javascript
javascript中的parseInt和parseFloat区别
Jul 12 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
Aug 22 Javascript
js代码实现下拉菜单【推荐】
Dec 15 Javascript
vue中$refs的用法及作用详解
Apr 24 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
Oct 22 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
Aug 27 Javascript
原生js实现贪食蛇小游戏的思路详解
Nov 26 Javascript
基于JavaScript实现省市联动效果
Jun 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
PHP微信开发之二维码生成类
2015/06/26 PHP
Symfony的安装和配置方法
2016/03/17 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
Smarty缓存机制实例详解【三种缓存方式】
2019/07/20 PHP
javascript动态加载三
2012/08/22 Javascript
javascript结合CSS实现苹果开关按钮特效
2015/04/07 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
详解Javascript中的Object对象
2016/02/28 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
AngularJS实现进度条功能示例
2017/07/05 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
js实现删除json中指定的元素
2020/09/22 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
使用Vant完成Dialog弹框案例
2020/11/11 Javascript
Python打包可执行文件的方法详解
2016/09/19 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
python3+opencv3识别图片中的物体并截取的方法
2018/12/05 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
Python 下载及安装详细步骤
2019/11/04 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
Python的信号库Blinker用法详解
2020/12/31 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
2014全国两会大学生学习心得体会
2014/03/10 职场文书
求职个人评价范文
2014/04/09 职场文书
职工宿舍管理制度
2015/08/05 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android