JS实现的二叉树算法完整实例


Posted in Javascript onApril 06, 2017

本文实例讲述了JS实现的二叉树算法。分享给大家供大家参考,具体如下:

<!DOCTYPE HTML>
<head>
   <title>20130328BinaryTree</title>
   <metahttp-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<html>
<body>
<script>
  //今天学习了下二叉树算法,总结在这里
  //1全局变量 binary Tree =bt
  //1.1 node
  function Node() {        //bt节点
    this.text = '';       //节点的文本
    this.leftChild = null;    //节点的左孩子引用
    this.rightild = null;     //节点右孩子引用
  }
  //1.2 二叉树装载的字符串
  var strText = "";
  var charecters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
  var len = charecters.length ;        //数组的长度
  var nodes = new Array();          //创建一个临时数组,用于存放二叉树节点
  //循环创建二叉树节点存放到数组中
  for (var i = 0 ; i < len ; i++) {
    var node = new Node();
    node.text = charecters[i];
    nodes.push(node);
  }
  var root = nodes[0];
  //1.3 栈
  function Stack() {
        var stack = new Array();        //存放栈的数组
        //压栈
        this.push = function(o) {
          stack.push(o);
        };
        //出栈
        this.pop = function() {
          var o = stack[stack.length-1];
          stack.splice(stack.length-1, 1);
          return o;
        };
        //检查栈是否为空
        this.isEmpty = function() {
          if(stack.length <= 0) {
            return true;
          }
          else {
            return false;
          }
        };
      }
      //使用方式如下
      var stack = new Stack();
      stack.push(1);    //现在栈中有一个元素
      stack.isEmpty();   //false , 栈不为空
      //alert(stack.pop()); //出栈, 打印1
      stack.isEmpty();   //true, 此时栈为空,因为在调用了stack.pop()之后元素出栈了,所以为空
  //2.1递归实现:
  function buildBt1(node, i) {
    var leftIndex = 2*i+1,             //左孩子节点的索引
      rightIndex = 2*i+2;             //右孩子节点的索引
    if(leftIndex < charecters.length) {       //判断索引的长度是否超过了charecters数组的大小
      var childNode = new Node();         //创建一个新的节点对象
      childNode.text = charecters[leftIndex];   //给节点赋值
      node.leftChild = childNode;         //给当前节点node加入左孩子节点
      buildBt1(childNode, leftIndex);      //递归创建左孩子
    }
    if(rightIndex < charecters.length) {      //同上
      var childNode = new Node();
      childNode.text = charecters[rightIndex];
      node.rightChild = childNode;
      buildBt1(childNode, rightIndex);
    }
  }
  //2.2非递归实现
  function buildBt2() {
    index = 0;               //索引从0开始
    //循环建立二叉树子节点的引用
    while(index < len) {
      var leftIndex = 2*index+1,       //当前节点左孩子索引
        rightIndex = 2*index+2;       //当前节点右孩子索引
      //给当前节点添加左孩子
      nodes[index].leftChild = nodes[leftIndex];
      //给当前节点添加右孩子
      nodes[index].rightChild = nodes[rightIndex];
      index++;
    }
  }
  //3遍历
  //3.1.1先序递归遍历
  function firstIteration(node) {
        if(node.leftChild) {          //判断当前节点是否有左孩子
          firstIteration(node.leftChild);  //递归左孩子
        }
        if(node.rightChild) {         //判断当前节点是否有右孩子
          firstIteration(node.rightChild);  //递归右孩子
        }
      }
      //递归遍历二叉树
      firstIteration(root);
  //3.1.2先序普通遍历
  function notFirstIteration(node) {
        var stack = new Stack(),         //开辟一个新的栈对象
          resultText = '';           //存放非递归遍历之后的字母顺序
        stack.push(root);            //这个root在上面非递归方式构建二叉树的时候已经构建好的
        var node = root;
        resultText += node.text;
        while(!stack.isEmpty()) {
          while(node.leftChild) {       //判断当前节点是否有左孩子节点
            node = node.leftChild;      //取当前节点的左孩子节点
            resultText += node.text;     //访问当前节点
            stack.push(node);        //将当前节点压入栈中
          }
          stack.pop();             //出栈
          node = stack.pop().rightChild;    //访问当前节点的兄弟节点(右孩子节点)
          if(node) {              //当前节点的兄弟节点不为空
            resultText += node.text;     //访问当前节点
            stack.push(node);        //将当前节点压入栈中
          }
          else {                //当前节点的兄弟节点为空
            node = stack.pop();       //在回溯到上一层
          }
        }
      }
      //非递归先序遍历
    //  notFirstIteration(root);
  //3.2.1中序递归遍历
  function btIteration21(node) {
    //访问左节点
    if(node.leftChild) {
      if(node.leftChild.leftChild) {
        btIteration21(node.leftChild);
      }
      else {
        strText += node.leftChild.text;
      }
    }
    //访问根节点
    strText += node.text;
    //访问右节点
    if(node.rightChild) {
      if(node.rightChild.leftChild) {
        btIteration21(node.rightChild);
      }
      else {
        strText += node.rightChild.text;
      }
    }
  }
  //测试区
  //2.1.1测试递归实现
  var node = new Node();
  node.text = charecters[0];
  buildBt1(node, 0);  //索引i是从0开始构建
  btIteration21(node);
  alert(strText);
</script>
</body>
</html>

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
不用MOUSEMOVE也能滑动啊
May 23 Javascript
JavaScript 对Cookie 操作的封装小结
Dec 31 Javascript
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
Jun 28 Javascript
关于javascript DOM事件模型的两件事
Jul 22 Javascript
JavaScript入门之事件、cookie、定时等
Oct 21 Javascript
JS仿百度搜索自动提示框匹配查询功能
Nov 21 Javascript
微信小程序 textarea 组件详解及简单实例
Jan 10 Javascript
node.js基于mongodb的搜索分页示例
Jan 22 Javascript
微信小程序 setData使用方法及常用错误解决办法
May 11 Javascript
基于JS脚本语言的基础语法详解
Jul 22 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
Sep 25 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
Jun 17 Javascript
JavaScript结合HTML DOM实现联动菜单
Apr 05 #Javascript
js实现按座位号抽奖
Apr 05 #Javascript
Angularjs 实现移动端在线测评效果(推荐)
Apr 05 #Javascript
微信小程序中的onLoad详解及简单实例
Apr 05 #Javascript
微信小程序 页面跳转如何实现传值
Apr 05 #Javascript
微信小程序 数据遍历的实现
Apr 05 #Javascript
微信小程序 图片绝对定位(背景图片)
Apr 05 #Javascript
You might like
PHP安全下载文件的方法
2016/04/07 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
通过Mootools 1.2来操纵HTML DOM元素
2009/09/15 Javascript
parentElement,srcElement的使用小结
2014/01/13 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
js document.write()使用介绍
2014/02/21 Javascript
JavaScript中的闭包(Closure)详细介绍
2014/12/30 Javascript
jQuery事件处理的特征(事件命名机制)
2016/08/23 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
Nodejs处理异常操作示例
2018/12/25 NodeJs
vue的注意规范之v-if 与 v-for 一起使用教程
2019/08/04 Javascript
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
Python脚本获取操作系统版本信息
2016/12/17 Python
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
Agoda.com官方网站:便宜预订全球酒店,高达80%的折扣
2018/04/04 全球购物
幼儿园毕业园长感言
2014/02/24 职场文书
代理协议书
2014/04/22 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
助学贷款贫困证明
2014/09/23 职场文书
诉讼和解协议书
2016/03/23 职场文书
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python