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 相关文章推荐
获取Javscript执行函数名称的方法
Dec 22 Javascript
JavaScript 在各个浏览器中执行的耐性
Apr 06 Javascript
让firefox支持IE的一些方法的javascript扩展函数代码
Jan 02 Javascript
js 分页全选或反选标识实现代码
Aug 09 Javascript
javascript dom追加内容实现示例
Sep 21 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
Feb 20 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
Sep 02 Javascript
详解Webpack实战之构建 Electron 应用
Dec 25 Javascript
基于datepicker定义自己的angular时间组件的示例
Mar 14 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
Apr 13 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
Sep 21 Javascript
微信小程序之高德地图多点路线规划过程示例详解
Jan 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二维码生成以及下载实现
2017/09/28 PHP
奇妙的js
2007/09/24 Javascript
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
Linux下使用jq友好的打印JSON技巧分享
2014/11/18 Javascript
基于jQuery实现中英文切换导航条效果
2016/09/18 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
2017/04/22 Javascript
基于vue2.0实现的级联选择器
2017/06/09 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
基于pandas数据样本行列选取的方法
2018/04/20 Python
django2用iframe标签完成网页内嵌播放b站视频功能
2018/06/20 Python
基于python中theano库的线性回归
2018/08/31 Python
python实现维吉尼亚加密法
2019/03/20 Python
Python实现简单的列表冒泡排序和反转列表操作示例
2019/07/10 Python
基于Python+Appium实现京东双十一自动领金币功能
2019/10/31 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
日本著名的平价时尚女性购物网站:Fifth
2016/08/24 全球购物
俄罗斯在线服装店:STOLNIK
2021/03/07 全球购物
餐饮业会计岗位职责
2013/12/19 职场文书
基层干部十八大感言
2014/01/19 职场文书
写自荐信三大法宝
2014/01/24 职场文书
一月红领巾广播稿
2014/02/11 职场文书
2014年父亲节活动方案
2014/03/06 职场文书
金融事务专业求职信
2014/04/25 职场文书
四川省传达学习贯彻党的群众路线教育实践活动总结大会精神新闻稿
2014/10/26 职场文书
2014年保育员工作总结
2014/12/02 职场文书
2014年法务工作总结
2014/12/11 职场文书
2015年小学教科研工作总结
2015/07/20 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
redis限流的实际应用
2021/04/24 Redis
分析Netty直接内存原理及应用
2021/06/14 Java/Android
JVM钩子函数的使用场景详解
2021/08/23 Java/Android
Python 统计序列中元素的出现频度
2022/04/26 Python
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL