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 相关文章推荐
JS array 数组详解
Mar 22 Javascript
jquery入门—访问DOM对象方法
Jan 07 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
Aug 21 Javascript
iframe的父子窗口之间的对象相互调用基本用法
Sep 03 Javascript
在javascript中执行任意html代码的方法示例解读
Dec 25 Javascript
jQuery实现3D文字特效的方法
Mar 10 Javascript
angular.bind使用心得
Oct 26 Javascript
基于javascript实现动态显示当前系统时间
Jan 28 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
Jun 03 Javascript
JS实现输入框提示文字点击时消失效果
Jul 19 Javascript
原生JS实现轮播图效果
Oct 12 Javascript
react 路由Link配置详解
Nov 11 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缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
php向js函数传参的几种方法
2014/08/10 PHP
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
2016/02/15 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
javascript 限制输入和粘贴(IE,firefox测试通过)
2008/11/14 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
js中的json对象详细介绍
2014/10/29 Javascript
javascript使用正则表达式检测IP地址
2014/12/03 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
2017/01/06 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
JavaScript数据结构之二叉树的删除算法示例
2017/04/13 Javascript
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
vue双花括号的使用方法 附练习题
2017/11/07 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
2020/03/07 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
js实现简单商品筛选功能
2021/02/02 Javascript
[49:08]Secret vs VP 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[26:50]2018完美盛典DOTA2表演赛
2018/12/17 DOTA
Python实现将文本生成二维码的方法示例
2017/07/18 Python
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
Python后台开发Django的教程详解(启动)
2019/04/08 Python
python实现简单井字棋游戏
2020/03/04 Python
Python request使用方法及问题总结
2020/04/26 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
我想声明一个指针并为它分配一些空间, 但却不行。这些代码有什么 问题?char *p; *p = malloc(10);
2016/10/06 面试题
高中三年学习生活的自我评价
2013/10/10 职场文书
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers
Anaconda安装pytorch和paddle的方法步骤
2022/04/03 Python