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 相关文章推荐
关于jQuery中的end()使用方法
Jul 10 Javascript
最好用的省市二级联动 原生js实现你值得拥有
Sep 22 Javascript
微信分享的标题、缩略图、连接及描述设置方法
Oct 14 Javascript
学习JavaScript设计模式(封装)
Nov 26 Javascript
Javascript中的数组常用方法解析
Jun 17 Javascript
jQuery中的deferred对象和extend方法详解
May 08 jQuery
Vue的elementUI实现自定义主题方法
Feb 23 Javascript
jQuery中使用validate插件校验表单功能
May 24 jQuery
layui动态渲染生成select的option值方法
Sep 23 Javascript
如何手写一个简易的 Vuex
Oct 10 Javascript
js实现详情页放大镜效果
Oct 28 Javascript
vue自定义右键菜单之全局实现
Apr 09 Vue.js
简单的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写入WRITE编码为UTF8的文件的实现代码
2008/07/07 PHP
PHP 批量删除数据的方法分析
2009/10/30 PHP
可输入的下拉框
2006/06/19 Javascript
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
js 实现菜单左右滚动显示示例介绍
2013/11/21 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
JavaScript获取页面中表单(form)数量的方法
2015/04/03 Javascript
JS中完美兼容各大浏览器的scrolltop方法
2015/04/17 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
Mac下使用charles遇到的问题以及解决办法
2017/01/10 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
讲解vue-router之什么是动态路由
2018/05/28 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
Python中的魔法方法深入理解
2014/07/09 Python
python实现的希尔排序算法实例
2015/07/01 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
python opencv实现证件照换底功能
2019/08/19 Python
详解Python 最短匹配模式
2020/07/29 Python
CSS3实现多背景展示效果通过CSS3定位多张背景
2014/08/10 HTML / CSS
微软中国官方旗舰店:销售Surface、Xbox One、笔记本电脑、Office
2018/07/23 全球购物
北京天润融通.net面试题笔试题
2012/02/20 面试题
医学毕业生自我鉴定
2013/10/30 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
个人党性分析总结
2015/03/05 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
预备党员考察意见范文
2015/06/01 职场文书