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取得iframe中元素的几种方法
Jul 04 Javascript
JavaScript的Module模式编程深入分析
Aug 13 Javascript
解析页面加载与js函数的执行 onload or ready
Dec 12 Javascript
浅谈javascript中字符串String与数组Array
Dec 31 Javascript
jQuery使用hide方法隐藏元素自身用法实例
Mar 30 Javascript
JavaScript中Date.toSource()方法的使用教程
Jun 12 Javascript
js精美的幻灯片画集特效代码分享
Aug 29 Javascript
Node.js调试技术总结分享
Mar 12 Javascript
详解jquery插件jquery.viewport.js学习使用方法
Sep 08 jQuery
使用next.js开发网址缩短服务的方法
Jun 17 Javascript
在vue中给后台接口传的值为数组的格式代码
Nov 12 Javascript
react如何快速设置文件路径别名
Apr 28 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
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
php addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
实现动画效果核心方式的js代码
2013/09/27 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
ionic2懒加载配置详解
2017/09/01 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
2019/01/06 Javascript
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
python将xml xsl文件生成html文件存储示例讲解
2013/12/03 Python
Python群发邮件实例代码
2014/01/03 Python
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
Python批量按比例缩小图片脚本分享
2015/05/21 Python
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
Python协程的用法和例子详解
2017/09/09 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
西班牙购买行李箱和背包网站:Maletas Greenwich
2019/10/08 全球购物
Nike意大利官网:Nike.com IT
2020/01/19 全球购物
全民健身日活动方案
2014/01/29 职场文书
教师党员一句话承诺
2014/03/28 职场文书
大学生应聘求职信
2014/05/26 职场文书
会计学自荐信
2014/06/03 职场文书
运动会口号大全
2014/06/07 职场文书
社会学专业求职信
2014/07/17 职场文书
2016应届毕业生自荐信范文
2016/01/28 职场文书