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 相关文章推荐
yepnope.js 异步加载资源文件
Sep 08 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
Jan 22 Javascript
jQuery获取当前对象标签名称的方法
Feb 07 Javascript
jQuery避免$符和其他JS库冲突的方法对比
Feb 20 Javascript
一个不错的js html页面倒计时可精确到秒
Oct 22 Javascript
javascript实现禁止鼠标滚轮事件
Jul 24 Javascript
js判断浏览器类型及设备(移动页面开发)
Jul 30 Javascript
js鼠标点击图片切换效果实现代码
Nov 19 Javascript
jQuery使用经验小技巧(推荐)
May 31 Javascript
JavaScript学习笔记整理_关于表达式和语句
Sep 19 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
Mar 04 Javascript
React通过父组件传递类名给子组件的实现方法
Nov 13 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
Windows IIS PHP 5.2 安装与配置方法
2009/06/08 PHP
PHP设计模式 注册表模式
2012/02/05 PHP
laravel实现于语言包的完美切换方法
2019/09/29 PHP
JavaScript类和继承 prototype属性
2010/09/03 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
2012/09/14 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
js中的cookie的读写操作示例详解
2014/04/17 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
为jQuery-easyui的tab组件添加右键菜单功能的简单实例
2016/10/10 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
2017/06/29 Javascript
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
微信小程序webview实现长按点击识别二维码功能示例
2019/01/24 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
python 读取excel文件生成sql文件实例详解
2017/05/12 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
Python使用matplotlib实现交换式图形显示功能示例
2019/09/06 Python
在python中使用nohup命令说明
2020/04/16 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
python 制作本地应用搜索工具
2021/02/27 Python
白色公司:The White Company
2017/10/11 全球购物
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
国际花店:Pickup Flowers
2020/04/10 全球购物
2014年创卫实施方案
2014/02/18 职场文书
感恩节活动策划方案
2014/05/16 职场文书
陕西导游词
2015/02/04 职场文书
读书笔记格式
2015/07/02 职场文书
小型企业的绩效考核制度模板
2019/11/21 职场文书
Java Socket实现多人聊天系统
2021/07/15 Java/Android
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python