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中数组array及string的方法总结
Nov 28 Javascript
AngularJS HTML编译器介绍
Dec 06 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
Apr 13 Javascript
Validform表单验证总结篇
Oct 31 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
Nov 21 Javascript
React BootStrap用户体验框架快速上手
Mar 06 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
May 16 Javascript
微信小程序实现长按删除图片的示例
May 18 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
Aug 28 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
May 07 Javascript
vue如何实现关闭对话框后刷新列表
Apr 08 Vue.js
JavaScript实现九宫格拖拽效果
Jun 28 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
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
PHP文件缓存内容保存格式实例分析
2014/08/20 PHP
PHP+jQuery翻板抽奖功能实现
2015/10/19 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
2019/10/17 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
js replace正则表达式应用案例讲解
2013/01/17 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
JS图片预加载插件详解
2017/06/21 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
2019/03/19 Javascript
layui 实现表格某一列显示图标
2019/09/19 Javascript
用原生JS实现爱奇艺首页导航栏代码实例
2019/09/19 Javascript
JS校验与最终登陆界面功能完整示例
2020/01/13 Javascript
vue实现评价星星功能
2020/06/30 Javascript
vue3.0+vue-router+element-plus初实践
2020/12/02 Vue.js
js属性对象的hasOwnProperty方法的使用
2021/02/05 Javascript
[03:42]2016国际邀请赛中国区预选赛首日现场玩家采访
2016/06/26 DOTA
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
Python 最大概率法进行汉语切分的方法
2018/12/14 Python
详解Python传入参数的几种方法
2019/05/16 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
Python3标准库glob文件名模式匹配的问题
2020/03/13 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
敏捷开发的主要原则都有哪些
2015/04/26 面试题
就业意向书范文
2014/04/01 职场文书
周年庆典主持词
2014/04/02 职场文书
伊索寓言教学反思
2014/05/01 职场文书
68句权威创业名言
2019/08/26 职场文书
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS
Python学习之时间包使用教程详解
2022/03/21 Python
Spring Cloud OpenFeign模版化客户端
2022/06/25 Java/Android