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

发布时间 - 2026-01-11 00:31:52    点击率:

本文实例讲述了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数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》

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


# JS  # 二叉树  # 算法  # JS实现二叉查找树的建立以及一些遍历方法实现  # JavaScript数据结构之二叉查找树的定义与表示方法  # JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例  # JavaScript实现二叉树定义、遍历及查找的方法详解  # JavaScript数据结构之二叉树的查找算法示例  # JavaScript实现二叉树的先序、中序及后序遍历方法详解  # javascript实现二叉树遍历的代码  # Javascript实现从小到大的数组转换成二叉搜索树  # JavaScript数据结构之二叉树的删除算法示例  # JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】  # JavaScript数据结构之二叉树的遍历算法示例  # JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解  # 递归  # 遍历  # 为空  # 创建一个  # 在这里  # 相关内容  # 中有  # 是从  # 感兴趣  # 数据结构  # 给大家  # 在上面  # 更多关于  # 所述  # 程序设计  # 上一层  # 组中  # 全局变量  # 超过了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何生成URL和重定向?(路由助手函数)  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何快速搭建高效WAP手机网站吸引移动用户?  Laravel如何与Inertia.js和Vue/React构建现代单页应用  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  Python函数文档自动校验_规范解析【教程】  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Laravel storage目录权限问题_Laravel文件写入权限设置  EditPlus中的正则表达式实战(5)  Thinkphp 中 distinct 的用法解析  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  使用Dockerfile构建java web环境  jQuery validate插件功能与用法详解  Linux网络带宽限制_tc配置实践解析【教程】  Laravel如何实现数据库事务?(DB Facade示例)  如何构建满足综合性能需求的优质建站方案?  如何在阿里云部署织梦网站?  如何快速完成中国万网建站详细流程?  Laravel怎么使用artisan命令缓存配置和视图  活动邀请函制作网站有哪些,活动邀请函文案?  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  Laravel如何实现一对一模型关联?(Eloquent示例)  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  成都网站制作公司哪家好,四川省职工服务网是做什么用?  JavaScript如何实现类型判断_typeof和instanceof有什么区别  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  iOS验证手机号的正则表达式  如何用西部建站助手快速创建专业网站?  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  JavaScript中的标签模板是什么_它如何扩展字符串功能  如何在云主机上快速搭建网站?  大型企业网站制作流程,做网站需要注册公司吗?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  如何确保FTP站点访问权限与数据传输安全?  Laravel如何使用Blade组件和插槽?(Component代码示例)  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Linux系统运维自动化项目教程_Ansible批量管理实战  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  JS经典正则表达式笔试题汇总  潮流网站制作头像软件下载,适合母子的网名有哪些?