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 相关文章推荐
javascript 控制 html元素 显示/隐藏实现代码
Sep 01 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
Jun 18 Javascript
JQuery中$之选择器用法介绍
Apr 05 Javascript
关于js拖拽上传 [一个拖拽上传修改头像的流程]
Jul 13 Javascript
jquery实现保存已选用户
Jul 21 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
Mar 16 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
Mar 21 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
Oct 25 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
Jan 03 Javascript
[jQuery] 事件和动画详解
Mar 05 jQuery
Vue侦测相关api的实现方法
May 22 Javascript
vue中实现高德定位功能
Dec 03 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
全国FM电台频率大全 - 20 广西省
2020/03/11 无线电
php中定义网站根目录的常用方法
2010/08/08 PHP
php数组查找函数总结
2014/11/18 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
thinkPHP框架整合tcpdf插件操作示例
2018/08/07 PHP
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
JS日期加减,日期运算代码
2015/11/05 Javascript
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
Vue 父子组件、组件间通信
2017/03/08 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
python发送伪造的arp请求
2014/01/09 Python
Python文件操作类操作实例详解
2014/07/11 Python
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
使用Python的内建模块collections的教程
2015/04/28 Python
python集合用法实例分析
2015/05/30 Python
Python制作爬虫抓取美女图
2016/01/20 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
python3设计模式之简单工厂模式
2017/10/17 Python
python事件驱动event实现详解
2018/11/21 Python
PYTHON发送邮件YAGMAIL的简单实现解析
2019/10/28 Python
解决python脚本中error: unrecognized arguments: True错误
2020/04/20 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
CSS3 渐变(Gradients)之CSS3 径向渐变
2016/07/08 HTML / CSS
大学生物业管理求职信
2013/10/24 职场文书
承诺函范文
2015/01/21 职场文书
村党组织公开承诺书
2015/04/30 职场文书
心灵点滴观后感
2015/06/02 职场文书
Spring Cloud Gateway去掉url前缀
2021/07/15 Java/Android
Python面向对象编程之类的概念
2021/11/01 Python
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS