在递归二叉树分析器

时间:2017-05-08 19:42:51

标签: javascript string binary-tree

给定(10(5(3)(12))(14(11)(17)))类型的输入 哪个代表以下树

 n=0            10
 n=1       5         14
 n=2    3    12    11   17 

我的任务是找到特定等级的值的总和(5+14=19,即n=1的总和,3+12+11+17=43的总和n=2



var input = 
"(10(5(3)(12))(14(11)(17)))";

function stripFirstLastParen(input){
  if(input[0] !== "(" || input[input.length - 1] !== ")"){
    console.error("unbalanced parens")
  }
  else{
    input = input.substr(1);
    input = input.substring(0, input.length - 1);
  }
  return input;
}

function getCurrentVal(input){
  var val = "";
  while(input[0] !== "(" && input[0] !== ")" && input.length){
    val += input[0];
    input = input.substr(1);
  }
  return {
    val,
    input
  }
}

function getChildren(input){
  var val = "";
  if(input.length == 0){
    return {
      left: "",
      right: ""
    }
  }
  if(input[0] !== "("){
    console.error("no open paren at start");
  }
  val += input[0];
  input = input.substr(1);
  var parenStack = 1;
  while(parenStack > 0){
    if(input[0] == ")"){
      parenStack--;
    }
    else if(input[0] == "("){
      parenStack++;
    }
    val += input[0];
    input = input.substr(1);
  }
  return {
    left: val, 
    right: input
  }
}

function getValueForLevel(input, k){
  var totalValue = 0;
  input = stripFirstLastParen(input);
  var currentValue = getCurrentVal(input);
  var children = getChildren(currentValue.input);
  if(k > 0){	
    if(children.left.length){
	   totalValue += getValueForLevel(children.left, k-1);
    }
    if(children.right.length){
	  totalValue += getValueForLevel(children.right, k-1);
    }
  }
  else if(k == 0){
    totalValue += JSON.parse(currentValue.val);
  }
  return totalValue;
}

var test = getValueForLevel(input, 2);
console.log(test);




我的关注主要在于如何进行字符串操作:stripFirstLastParen将删除第一个和最后一个paren,getCurrentVal在读取时删除该值。

这是一次采访练习,我想填补我的知识空白:

我确实理解读取应该是非破坏性的操作(即获取节点的当前值不应该从输入字符串中删除它)。在这个例子中,是否值得分离关注点(单独读取和更改输入字符串),还是会增加开销的复杂性?另外迭代字符串可能被认为是不利的(解析一次,第二次删除读取值)。

我无法想到"为什么你的阅读功能应该是idempotent"除了一般测试/可用性之外,在这里是幂等的重要性,还是可以随意地在地毯下扫描(假设这是一个练习)?

0 个答案:

没有答案