数学1104. 二叉树寻路(中等)
Posted 煮雪烧茶的刷题日记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学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值进行操作,否则会发生错误。也可以把这一行单独拿出来讨论~
以上是关于数学1104. 二叉树寻路(中等)的主要内容,如果未能解决你的问题,请参考以下文章
[M二叉树] lc1104. 二叉树寻路(思维+找规律+数学)
LeetCode 1104 二叉树寻路[数学 二叉树 位运算] HERODING的LeetCode之路
LeetCode 1104. 二叉树寻路/103. 二叉树的锯齿形层序遍历/ 171. Excel表列序号/ 987. 二叉树的垂序遍历