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 相关文章推荐
jquery文档操作wrap()方法实例简述
Jan 10 Javascript
轻量级的原生js日历插件calendar.js使用指南
Apr 28 Javascript
angularjs封装bootstrap时间插件datetimepicker
Jun 20 Javascript
JS 拼凑字符串的简单实例
Sep 02 Javascript
javascript汉字拼音互转的简单实例
Oct 09 Javascript
BootStrap表单时间选择器详解
May 09 Javascript
微信小程序搜索组件wxSearch实例详解
Jun 08 Javascript
JavaScript实现图片拖曳效果
Sep 08 Javascript
angular4实现tab栏切换的方法示例
Oct 21 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
Feb 21 Javascript
vue 标签属性数据绑定和拼接的实现方法
May 17 Javascript
Angular中innerHTML标签的样式不起作用的原因解析
Jun 18 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 分库分表hash算法
2009/11/12 PHP
smarty获得当前url的方法分享
2014/02/14 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
2015/11/10 PHP
关于flash遮盖div浮动层的解决方法
2010/07/17 Javascript
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
jQuery 特性操作详解及实例代码
2016/09/29 Javascript
Vue.js自定义指令的用法与实例解析
2017/01/18 Javascript
js CSS3实现卡牌旋转切换效果
2017/07/04 Javascript
ReactNative踩坑之配置调试端口的解决方法
2017/07/28 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
vue实现商城秒杀倒计时功能
2019/12/12 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
python通过文件头判断文件类型
2015/10/30 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
Python3计算三角形的面积代码
2017/12/18 Python
mac下如何将python2.7改为python3
2018/07/13 Python
Python版名片管理系统
2018/11/30 Python
20行python代码的入门级小游戏的详解
2019/05/05 Python
Python求均值,方差,标准差的实例
2019/06/29 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
2020/05/20 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
耐克中国官方商城:Nike中国
2018/10/18 全球购物
《吃水不忘挖井人》教学反思
2014/04/15 职场文书
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript
python opencv检测直线 cv2.HoughLinesP的实现
2021/06/18 Python
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android
Java使用HttpClient实现文件下载
2022/08/14 Java/Android