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 实现模态对话框 源代码大全
May 02 Javascript
理解Javascript_10_对象模型
Oct 16 Javascript
使用JavaScript的AngularJS库编写hello world的方法
Jun 23 Javascript
Bootstrap轮播图的使用和理解4
Dec 14 Javascript
layui table 参数设置方法
Aug 14 Javascript
Vue2实时监听表单变化的示例讲解
Aug 30 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
Dec 05 Javascript
PM2自动部署代码步骤流程总结
Dec 10 Javascript
微信小程序自定义键盘 内部虚拟支付
Dec 20 Javascript
Seajs源码详解分析
Apr 02 Javascript
Vue.js组件使用props传递数据的方法
Oct 19 Javascript
Vue单文件组件开发实现过程详解
Jul 30 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
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
php实现生成code128条形码的方法详解
2017/07/19 PHP
Laravel框架用户登陆身份验证实现方法详解
2017/09/14 PHP
JS 控制非法字符的输入代码
2009/12/04 Javascript
JSON JQUERY模板实现说明
2010/07/03 Javascript
JavaScript 盒模型 尺寸深入理解
2012/12/31 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
js实现上下左右弹框划出效果
2017/03/08 Javascript
vue时间格式化实例代码
2017/06/13 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
微信小程序自定义联系人弹窗
2020/05/26 Javascript
python显示生日是星期几的方法
2015/05/27 Python
Python实现的凯撒密码算法示例
2018/04/12 Python
python实现趣味图片字符化
2019/04/30 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
python的移位操作实现详解
2019/08/21 Python
python 命令行传入参数实现解析
2019/08/30 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
2020/07/31 Python
Python简单实现词云图代码及步骤解析
2020/06/04 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
Django crontab定时任务模块操作方法解析
2020/09/10 Python
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
bareMinerals官网:矿物质化妆品和护肤品
2018/02/04 全球购物
介绍下WebSphere的安全性
2013/01/31 面试题
WINDOWS域的具体实现方式是什么
2014/02/20 面试题
毕业生护理专业个人求职信范文
2014/01/04 职场文书
2014年政工师工作总结
2014/12/18 职场文书
廉政承诺书范文
2015/04/28 职场文书
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技