欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-08 10:01:28
本文实例讲述了js实现的二叉树算法。分享给大家供大家参考,具体如下:

本文实例讲述了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程序设计有所帮助。