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获得网页窗口实际大小的示例代码
Sep 21 Javascript
节点的插入之append()和appendTo()的用法介绍
Jan 13 Javascript
javascript页面渲染速度测试脚本分享
Apr 15 Javascript
Javascript实现简单的富文本编辑器附演示
Jun 16 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
Aug 22 Javascript
Bootstrap Navbar Component实现响应式导航
Oct 08 Javascript
详解AngularJS中的表单验证(推荐)
Nov 17 Javascript
微信小程序 解决swiper不显示图片的方法
Jan 04 Javascript
原生JavaScript实现remove()和recover()功能示例
Jul 24 Javascript
Vue axios设置访问基础路径方法
Sep 19 Javascript
基于canvas实现手写签名(vue)
May 21 Javascript
vue渲染方式render和template的区别
Jun 05 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做的端口嗅探器--可以指定网站和端口
2006/10/09 PHP
php 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
PHP常用正则表达式集锦
2014/08/17 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
2014/08/19 PHP
php替换字符串中间字符为省略号的方法
2015/05/04 PHP
php基于PDO连接MSSQL示例DEMO
2016/07/13 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
js实现非常简单的焦点图切换特效实例
2015/05/07 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
2016/05/27 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
JavaScript的console命令使用实例
2019/12/03 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
vue修改Element的el-table样式的4种方法
2020/09/17 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python中的exec、eval使用实例
2014/09/23 Python
python安装twisted的问题解析
2018/08/21 Python
Python实现数据结构线性链表(单链表)算法示例
2019/05/04 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
高三英语教学反思
2014/01/13 职场文书
《陶罐和铁罐》教学反思
2014/02/19 职场文书
网络编辑职责
2014/03/01 职场文书
小学生手册家长评语
2014/04/16 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
2014年国庆节演讲稿
2014/09/19 职场文书
写给女朋友的保证书
2015/05/09 职场文书
经费申请报告范文
2015/05/18 职场文书
Python读写yaml文件
2022/03/20 Python
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers