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 相关文章推荐
jquery ready()的几种实现方法小结
Jun 18 Javascript
jQuery获得内容和属性示例代码
Jan 16 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
Apr 10 Javascript
javascript获取checkbox复选框获取选中的选项
Aug 12 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
Dec 01 Javascript
新闻上下滚动jquery 超简洁(必看篇)
Jan 21 Javascript
详解React之父子组件传递和其它一些要点
Jun 25 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
Oct 10 jQuery
React和Vue中监听变量变化的方法
Nov 14 Javascript
详解Vue CLI 3.0脚手架如何mock数据
Nov 23 Javascript
bootstrap tooltips在 angularJS中的使用方法
Apr 10 Javascript
vue前后分离调起微信支付
Jul 29 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+highchats生成动态统计图
2014/05/21 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
静态页面的值传递(三部曲)
2006/09/25 Javascript
javascript 操作文件 实现方法小结
2009/07/02 Javascript
基于jquery的滑动样例代码
2010/11/20 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
2016/01/01 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
jQuery实现的纵向下拉菜单实例详解【附demo源码下载】
2016/07/09 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
2019/01/22 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
2020/09/02 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
ES6 十大特性简介
2020/12/09 Javascript
详解Vue2的diff算法
2021/01/06 Vue.js
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
wxpython绘制音频效果
2019/11/18 Python
Python多线程thread及模块使用实例
2020/04/28 Python
CSS3制作半透明边框(Facebox)类似渐变
2012/12/09 HTML / CSS
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
信用社实习人员自我鉴定
2013/09/20 职场文书
社区学习雷锋活动总结
2014/04/25 职场文书
关于建议书的格式范文
2014/05/20 职场文书
庆祝儿童节标语
2014/10/09 职场文书
高中班主任心得体会
2016/01/07 职场文书
PHP使用QR Code生成二维码实例
2021/07/07 PHP