在Javascript中修复无限循环需要帮助

时间:2017-09-29 18:40:02

标签: javascript chai treenode

我有以下逻辑,当我在一个独立的jsbin中运行它时它工作正常并返回结果。 代码只是将字符串反序列化为树对象

我的要求是以字符串格式获取节点信息,如“1,2,3,4”,然后以二叉树结构输出节点:1表示root,2表示root.left,3表示root.right ,4用于root.left.left等...

但是当我使用require命令使用node.js调用它时,while循环将永远存在并且不返回值..

我是node.js的新手。

请帮助

独立的jsbin脚本 下面代码的链接,在jsbin中运行

http://jsbin.com/tukigaq/edit?js,console,output

(function(exports) {
  'use strict';

  console.clear();

  var createTree = function(treeString) {

    var createTreeNode = function(value) {
      var TreeNode = function(value) {
        this.left = null;
        this.right = null;
        this.val = value;
      };
      return new TreeNode(value);
    };

    var treeStringSplit = treeString.split(',');
    var root = createTreeNode(treeStringSplit[0]);
    var q = [];
    q.push(root);

    var i = 1;
    while (q.length > 0) {
      var node = q.shift();

      if (node == null)
        continue;

      if (treeStringSplit[i] !== '#') {
        node.left = createTreeNode(treeStringSplit[i]);
        q.push(node.left);
      } else {
        node.left = null;
        q.push(null);
      }

      i++;

      if (treeStringSplit[i] !== '#') {
        node.right = createTreeNode(treeStringSplit[i]);
        q.push(node.right);
      } else {
        node.right = null;
        q.push(null);
      }
      i++;
    }

    return root;
  }

  console.log(createTree("1,#,2,3,4"));


})(typeof window === 'undefined' ? module.exports : window)

我如何在测试方法中调用它

  var expect = require('chai').expect;
  var helper = require('../index');

  describe('createTree', function() {
      test createTree function
       it('should create a tree for the structure', function() {
           var result = helper.createTree("1,2,3");
           expect(result.val).to.equal(1);
           expect(result.left.val).to.equal(2);
           expect(result.right.val).to.equal(2);
       });
       it('should create a tree for the structure', function() {
           var result = helper.createTree("1,#");
           expect(result.val).to.equal(1);
           expect(result.left.val).to.equal(null);
           expect(result.right.val).to.equal(null);
       });
   });

1 个答案:

答案 0 :(得分:1)

是的,您在开始时移动阵列,但是在每次通过循环时您都会多次推送到阵列。

您在每次传递时移开第一个元素,但这两个if语句都会向数组中添加新元素:

    if (treeStringSplit[i] !== '#') {
      node.left = createTreeNode(treeStringSplit[i]);
      q.push(node.left);
    } else {
      node.left = null;
      q.push(null);
    }

    i++;

    if (treeStringSplit[i] !== '#') {
      node.right = createTreeNode(treeStringSplit[i]);
      q.push(node.right);
    } else {
      node.right = null;
      q.push(null);
    }

    i++;

所以你总是会拥有比你更多的元素。我不确定你要完成什么,但你需要一些额外的控制逻辑来从阵列中删除更多元素或者防止在每次传递中添加多个元素。

工作示例

这里有一个有关我认为你正在努力实现的行为的实例的掠夺者:https://jsfiddle.net/abfoxef/25ny62h8/

二进制树代码不是我的,它改编自an excellent resource on computer science in javascript

改编原始代码

这是一个片段(不会永远运行),您可以在其中看到阵列结构中发生了什么:



var createTree = function(treeString) {

  var createTreeNode = function(value) {
    var TreeNode = function(value) {
      this.left = null;
      this.right = null;
      this.val = value;
    };
    return new TreeNode(value);
  };

  var treeStringSplit = treeString.split(',');
  var root = createTreeNode(treeStringSplit[0]);
  var q = [];
  q.push(root);

  var i = 0;
  console.log('What is q in the beginning?', q);
  while (i < 25) {
    var node = q.shift();
    console.log('What is q after shift?', q);
    
    if (node == null)
      continue;

    if (treeStringSplit[i] !== '#') {
      node.left = createTreeNode(treeStringSplit[i]);
      q.push(node.left);
    } else {
      node.left = null;
      q.push(null);
    }

    i++;

    if (treeStringSplit[i] !== '#') {
      node.right = createTreeNode(treeStringSplit[i]);
      q.push(node.right);
    } else {
      node.right = null;
      q.push(null);
    }
    
    i++;
    
    console.log('What is q at the end of the loop', q);
  }

  return root;
}
console.log(createTree("1,#,2,3,4"));
&#13;
&#13;
&#13;

相关问题