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 相关文章推荐
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
Dec 22 Javascript
JavaScript SetInterval与setTimeout使用方法详解
Nov 15 Javascript
php读取sqlite数据库入门实例代码
Jun 25 Javascript
jquery 取子节点及当前节点属性值的方法
Aug 24 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
Dec 04 Javascript
JavaScript判断用户名和密码不能为空的实现代码
May 16 Javascript
关于vue.js弹窗组件的知识点总结
Sep 11 Javascript
js操作浏览器的参数方法
Jan 21 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
Nov 09 Javascript
Node.js使用Koa搭建 基础项目
Jan 08 Javascript
浅谈Node 调试工具入门教程
Mar 20 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
Jun 29 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 上传文件的方法(类)
2009/07/30 PHP
php实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
PHP APC配置文件2套和参数详解
2014/06/11 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
javascript URL锚点取值方法
2009/02/25 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
JavaScript事件学习小结(三)js事件对象
2016/06/09 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
vue实现表格过滤功能
2019/09/27 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
python写的ARP攻击代码实例
2014/06/04 Python
Python实现的购物车功能示例
2018/02/11 Python
对numpy 数组和矩阵的乘法的进一步理解
2018/04/04 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
2018/10/09 Python
python3.x实现base64加密和解密
2019/03/28 Python
Windows系统下pycharm中的pip换源
2020/02/23 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
html5录音功能实战示例
2019/03/25 HTML / CSS
英国香水店:The Perfume Shop
2017/03/27 全球购物
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
英国珠宝和手表专家:Pleasance & Harper
2020/10/21 全球购物
应届生求职推荐信
2013/10/28 职场文书
医学生自荐信范文
2013/12/03 职场文书
2014年幼儿园重阳节活动方案
2014/09/16 职场文书
千手观音观后感
2015/06/03 职场文书
Mysql排查分析慢sql之explain实战案例
2022/04/19 MySQL
html解决浏览器记住密码输入框的问题
2023/05/07 HTML / CSS
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android