有没有一种方法可以数学上找到正确的节点?

时间:2019-03-26 06:28:47

标签: java

来自https://open.kattis.com/problems/numbertree的问题,来自2014年KTH挑战

This is how the number tree looks like

我使用了for循环来遍历由“ L”和“ R”组成的输入字符串,并使用curr来存储要评估的当前变量,并在此迭代之前先存储该变量。

if (i == 0) { //first 'L' or 'R'
   if (curr == 'L') { count++; }
   if (curr == 'R') { count +=2 ; }
} 

在这里,如果当前字符与前一个字符相同,则我将count增加2到通过的循环次数,如果当前字符与前一个字符不同,则将其减去1。

else if (curr == prev) { count += (int) Math.pow(2, h); }
else if (curr != prev) { count += (int) Math.pow(2, h)-1;

在每个循环结束时,我将prev等同于curr并增加h。

此逻辑适用于三个给定的输入3 LR3 RRL2,它们返回112和{{1} }。

但是它没有通过隐藏的测试用例。我尝试过的一种输入是7 应该返回3 LLL,但是我的算法返回83应该返回5,但我得到3。

是否存在一个使用数据结构来获取解决方案的解决方案,因为该问题引用了“完美的二叉树”。感谢您在解决我的逻辑以及其他解决方案方面的任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

作为完美的二叉树,级别x的最低节点大于2 ^ k的总和,其中k是从级别x + 1到H的节点数。路径5 RL告诉您您在5级树上的2级中有一个节点,因此该节点大于2 ^ 3 + 2 ^ 4 + 2 ^ 5 =56。现在我们将树简化为H = h(x),可以观察到节点的路径不过是二进制代码,其中L = 0,R = 1。我们将此二进制代码转换为整数,将其求和为之前获得的数字,然后得到节点的标签。路径RL为10 = 2,然后5 RL具有标签58。

现在,转换此算法非常简单,因为您只需将数组分成两部分,以二进制代码转换R-L路径并进行数学运算即可。