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 相关文章推荐
javascript下过滤数组重复值的代码
Sep 10 Javascript
ExtJs中简单的登录界面制作方法
Aug 19 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
Mar 28 Javascript
很棒的学习jQuery的12个网站推荐
Apr 28 Javascript
c#和Javascript操作同一json对象的实现代码
Jan 17 Javascript
JQuery筛选器全系列介绍
Aug 27 Javascript
jQuery实现跟随鼠标运动图层效果的方法
Feb 02 Javascript
JavaScript访问字符串中单个字符的两种方法
Jul 03 Javascript
jQuery超简单选项卡完整实例
Sep 26 Javascript
jquery实现具有收缩功能的垂直导航菜单
Feb 16 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
Mar 04 Javascript
解决vue下载后台传过来的乱码流的问题
Dec 05 Vue.js
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模板中出现空行解决方法
2011/03/08 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
JavaScript 事件的一些重要说明
2009/10/25 Javascript
javascript中的prototype属性实例分析说明
2010/08/09 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
JavaScript中使用构造器创建对象无需new的情况说明
2012/03/01 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
[02:15]2014DOTA2国际邀请赛 赛后退役选手回顾
2014/08/01 DOTA
web.py在模板中输出美元符号的方法
2014/08/26 Python
深入理解Python 代码优化详解
2014/10/27 Python
深入探究Python中变量的拷贝和作用域问题
2015/05/05 Python
python生成随机密码或随机字符串的方法
2015/07/03 Python
详解Python的Django框架中的模版继承
2015/07/16 Python
python音频处理用到的操作的示例代码
2017/10/27 Python
简单实现Python爬取网络图片
2018/04/01 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
Moda Operandi官网:美国奢侈品电商,海淘秀场T台同款
2020/05/26 全球购物
澳大利亚网上书店:QBD
2021/01/09 全球购物
会议活动邀请函
2014/01/27 职场文书
教师节感恩老师演讲稿
2014/08/28 职场文书
熟背这些句子,让您的英语口语突飞猛进(135句)
2019/09/06 职场文书
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle