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中的枚举功能
Mar 06 Javascript
javascript 控制input只允许输入的各种指定内容
Jun 19 Javascript
JavaScript实现的in_array函数
Aug 27 Javascript
javascript实现微信分享
Dec 23 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
Nov 03 Javascript
关于js原型的面试题讲解
Sep 25 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
Mar 05 Javascript
vue.js实现简单轮播图效果
Oct 10 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
May 13 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
Sep 28 Javascript
基于JS实现一个随机生成验证码功能
May 29 Javascript
JS箭头函数和常规函数之间的区别实例分析【 5 个区别】
May 27 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性能分析工具XHProf安装使用教程
2015/05/13 PHP
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
cookie中的path与domain属性详解
2013/12/18 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
JS的数组迭代方法
2015/02/05 Javascript
javascript中动态函数用法实例分析
2015/05/14 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
JS实现的几个常用算法
2016/11/12 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
TypeScript入门-基本数据类型
2017/03/28 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
javascript闭包的使用之按钮切换功能
2018/08/30 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
Python中的数据对象持久化存储模块pickle的使用示例
2016/03/03 Python
python 拼接文件路径的方法
2018/10/23 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
2019/04/05 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
浅谈django 重载str 方法
2020/05/19 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
2020/12/04 Python
用python批量下载apk
2020/12/29 Python
新加坡最受追捧的体验平台:Hapz
2018/01/01 全球购物
美国学校用品、教室和教学商店:Discount School Supply
2018/04/04 全球购物
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
挂职思想汇报
2013/12/31 职场文书
初一家长会邀请函
2014/01/31 职场文书
家长寄语大全
2014/04/02 职场文书
党政领导班子四风问题对照检查材料思想汇报
2014/10/02 职场文书
孝女彩金观后感
2015/06/10 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书