javascript数据结构之二叉搜索树实现方法


Posted in Javascript onNovember 25, 2015

本文实例讲述了javascript二叉搜索树实现方法。分享给大家供大家参考,具体如下:

二叉搜索树顾名思义,树上每个节点最多只有二根分叉;而且左分叉节点的值 < 右分叉节点的值

特点插入节点、找最大/最小节点、节点值排序 非常方便

二叉搜索树-javascript实现

<script type="text/javascript">
// <![CDATA[
 //打印输出
 function println(msg) {
  document.write(msg + " ");
 }
 //节点类
 var Node = function (v) {
  this.data = v; //节点值
  this.left = null; //左节点
  this.right = null; //右节点
 }
 //二叉搜索树类
 var BinarySearchTree = function () {
  this.root = null; //初始化时,根节点为空
  //插入节点
  //参数:v 为节点的值
  this.insert = function (v) {
   var newNode = new Node(v);
   if (this.root == null) {
    //树为空时,新节点,直接成为根节点
    this.root = newNode;
    return;
   }
   var currentNode = this.root; //工作“指针”节点(从根开始向下找)
   var parentNode = null;
   while (true) {
    parentNode = currentNode;
    if (v < currentNode.data) {
     //当前节点的值 > 目标节点的值     
     //应该向左插,工作节点移到左节点
     currentNode = currentNode.left;
     if (currentNode == null) {
      //没有左节点,则新节点,直接成为左节点
      parentNode.left = newNode;
      return; //退出循环
     }
    }
    else {
     //否则向右插,工作节点移到右节点
     currentNode = currentNode.right;
     if (currentNode == null) {
      parentNode.right = newNode;
      return;
     }
    }
   }
  }
  //查找最小节点
  this.min = function () {
   var p = this.root; //工作节点 
   while (p != null && p.left != null) {
    p = p.left;
   }
   return p;
  }
  //查找最大节点
  this.max = function () {
   var p = this.root; //工作节点 
   while (p != null && p.right != null) {
    p = p.right;
   }
   return p;
  }
  //中序遍历
  this.inOrder = function (rootNode) {
   if (rootNode != null) {
    this.inOrder(rootNode.left); //先左节点
    println(rootNode.data); //再根节点
    this.inOrder(rootNode.right); //再右节点
   }
  }
  //先序遍历
  this.preOrder = function (rootNode) {
   if (rootNode != null) {
    println(rootNode.data); //先根
    this.preOrder(rootNode.left); //再左节点
    this.preOrder(rootNode.right); //再右节点
   }
  }
  //后序遍历
  this.postOrder = function (rootNode) {
   if (rootNode != null) {
    this.postOrder(rootNode.left); //先左节点
    this.postOrder(rootNode.right); //再右节点
    println(rootNode.data); //再根节点
   }
  }
 }
 //以下是测试
 var bTree = new BinarySearchTree();
 //《沙特.算法设计技巧与分析》书上图3.9 左侧的树
 bTree.insert(6);
 bTree.insert(3);
 bTree.insert(8);
 bTree.insert(1);
 bTree.insert(4);
 bTree.insert(9);
 println('中序遍历:')
 bTree.inOrder(bTree.root);
 println("<br/>");
 println("先序遍历:");
 bTree.preOrder(bTree.root);
 println("<br/>");
 println("后序遍历:");
 bTree.postOrder(bTree.root);
 println("<br/>");
 var minNode = bTree.min();
 println("最小节点:" + (minNode == null ? "不存在" : minNode.data));
 println("<br/>");
 var maxNode = bTree.max();
 println("最大节点:" + (maxNode == null ? "不存在" : maxNode.data));
// ]]>
</script>
<!--中序遍历: 1 3 4 6 8 9 <br> 先序遍历: 6 3 1 4 8 9 <br> 后序遍历: 1 4 3 9 8 6 <br> 最小节点:1 <br> 最大节点:9-->

输出结果:

中序遍历: 1 3 4 6 8 9 
先序遍历: 6 3 1 4 8 9 
后序遍历: 1 4 3 9 8 6 
最小节点:1 
最大节点:9

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JObj预览一个JS的框架
Mar 13 Javascript
JavaScript游戏之优化篇
Nov 08 Javascript
juqery 学习之三 选择器 可见性 元素属性
Nov 25 Javascript
js如何判断用户是在PC端和还是移动端访问
Apr 24 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
May 28 Javascript
js实现获取焦点后光标在字符串后
Sep 17 Javascript
基于JavaScript代码实现pc与手机之间的跳转
Dec 23 Javascript
jQuery实现拼图小游戏(实例讲解)
Jul 24 jQuery
vue 过滤器filter实例详解
Mar 14 Javascript
layui动态表头的实现代码
Aug 22 Javascript
layui禁用侧边导航栏点击事件的解决方法
Sep 25 Javascript
vue项目在webpack2实现移动端字体自适配功能
Jun 02 Javascript
javascript常用经典算法实例详解
Nov 25 #Javascript
javascript实现很浪漫的气泡冒出特效
Sep 05 #Javascript
jQuery插件jquery-barcode实现条码打印的方法
Nov 25 #Javascript
JavaScript编写简单的计算器
Nov 25 #Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
Nov 25 #Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
Nov 25 #Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
Nov 25 #Javascript
You might like
php调用C代码的实现方法
2014/03/11 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
2016/03/21 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
php设计模式之工厂模式用法经典实例分析
2019/09/20 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
2016/04/17 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
AngularJS动态加载模块和依赖的方法分析
2016/11/08 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
react中的ajax封装实例详解
2017/10/17 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
Vue页面手动刷新,实现导航栏激活项还原到初始状态
2020/08/06 Javascript
[02:01]2018完美盛典-开场舞《双子星》
2018/12/16 DOTA
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
Python填充任意颜色,不同算法时间差异分析说明
2020/05/16 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
舞蹈比赛获奖感言
2014/02/04 职场文书
大型演出策划方案
2014/05/28 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
合作协议书范本
2014/10/25 职场文书
感谢信怎么写
2015/01/21 职场文书
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA
如何Tomcat中使用ipv6地址
2022/05/06 Servers