【数学】1104. 二叉树寻路(中等)
让我们先来看看这道题目的描述
因为题目给出的是完全二叉树,所以我们可以用数学技巧来实现,当偶数行时,label是从右向左排列的,而当奇数行时,label是从左向右排列的。
如果不考虑奇偶性,都按照从左到右的顺序,一个节点的两个子节点的值分别为val * 2 , val * 2 + 1,有比较强的规律
所以我们将偶数行的值先按照正常顺序排列,再计算得到真正的值
一个偶数行的数值真正的情况应该为 2 ^ 行数 - 1 + 2 ^ 行数 - 1 - val
private int reverse(int val, int depth){
return (1 << depth - 1) + (1 << depth) - 1 - val;
}
class Solution{
public List<Integer> pathInZigZagTree(int label) {
List<Integer> ans = new ArrayList<>();
int depth = findDepth(label);
if (depth % 2 == 0) {
label = reverse(label, depth);
}
while(depth > 0){
if(depth % 2 != 0){
ans.add(label);
}else{
ans.add(reverse(label, depth));
}
depth--;
label >>= 1;
}
Collections.reverse(ans);
return ans;
}
private int findDepth(int val){
int depth = 0;
while(val >= 1){
val >>= 1;
depth++;
}
return depth;
}
private int reverse(int val, int depth){
return (1 << depth - 1) + (1 << depth) - 1 - val;
}
}
如果计算出的总行数为偶数,需要先对这个label值进行操作,否则会发生错误。也可以把这一行单独拿出来讨论~