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

Need Help in fixing the infinite loop in Javascript

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

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

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

我是 node.js 的新手。

请帮忙

独立jsbin脚本 link 以下代码在 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);
       });
   });

是的,您在开始时移动了数组,但随后在每次通过循环时将多次推入数组。

你每次都移开第一个元素,但是这两个 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++;

因此,您拥有的元素总是比您转移的要多。我不确定您要完成什么,但您需要一些额外的控制逻辑来从数组中删除更多元素或防止在每次传递时添加多个元素。

工作示例

这是一个 plunker,其中包含我认为您正在尝试实现的行为的工作示例: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"));