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 相关文章推荐
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
Sep 20 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
Jan 12 Javascript
js下拉菜单语言选项简单实现
Sep 23 Javascript
js实现按钮控制图片360度翻转特效的方法
Feb 17 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
Aug 07 Javascript
js格式化输入框内金额、银行卡号
Feb 01 Javascript
vue项目常用组件和框架结构介绍
Dec 24 Javascript
基于Node.js实现压缩和解压缩的方法
Feb 13 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
Jan 18 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
Jul 15 Javascript
微信小程序绘制半圆(弧形)进度条
Nov 18 Javascript
原生js中运算符及流程控制示例详解
Jan 05 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
php面向对象全攻略 (九)访问类型
2009/09/30 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
PHP编写RESTful接口
2016/02/23 PHP
PHP动态生成指定大小随机图片的方法
2016/03/25 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
canvas绘制多边形
2017/02/24 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
2019/01/18 jQuery
JavaScript中的相等操作符使用详解
2019/12/21 Javascript
jquery检测上传文件大小示例
2020/04/26 jQuery
Python的Flask框架中实现分页功能的教程
2015/04/20 Python
Python中内建函数的简单用法说明
2016/05/05 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
机器学习实战之knn算法pandas
2019/06/22 Python
python连接mongodb集群方法详解
2020/02/13 Python
使用python求解二次规划的问题
2020/02/29 Python
Python基于Faker假数据构造库
2020/11/30 Python
Hotels.com南非:酒店预订
2017/11/02 全球购物
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
沙特阿拉伯排名第一的在线时尚购物应用程序:1Zillion
2020/08/08 全球购物
保护环境建议书
2014/03/12 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
家庭教育的心得体会
2014/09/01 职场文书
银行催款通知书
2015/04/17 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
Python中文纠错的简单实现
2021/07/07 Python
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸
vue2的 router在使用过程中遇到的一些问题
2022/04/13 Vue.js