https://leetcode-cn.com/problems/path-in-zigzag-labelled-binary-tree/solution/1104-er-cha-shu-xun-lu-jie-jin-shuang-ba-lmrd/
解题思路
首先确定层数int lg = log2(label); 获得当前label的子孩子(3 * pow(2, lg) - 1 - label)
/ 2 即该层的镜像(距离该层两边界相等对称面)值/2:就是当前层的镜像/2:当前层的镜像3 * pow(2, log2(label)) -
1 - label 镜像的获得:比如当前节点为14 那么log2后得到3,2^3 =
8就获得了当前层的最小值(获得8这一步可以用位运算直接获得2进制数中最前面那个1 +
后面一些0,我这个解法绕圈子了),因为等差数列的性质,当前列最小值 + 最大值 -
label就可以获得label的镜像值了,最大值刚好是最小值的二倍然后减一,就可以得到镜像的公式3 * (2^log2(label)) -
1 - label 其实还可以继续优化: 可以发现虽然直接上一层不能/2求得,但/2后再/2就可以得到当前节点的孙子值
根据以上思路,不用每次都求镜像,只要求一次给定label的孩子label_son,然后每轮依次label/=2,
label_son/=2加入相应数组位置,当有一个为1的时候退出循环返回结果值就可以了。 但是,,懒惰 +
愚蠢的我没写对,就写了这个简单一些的。
代码
class Solution {
public:
vector<int> pathInZigZagTree(int label) {
int lg = log2(label);
vector<int> ans(log2(label) + 1, 0);
ans[lg] = label;
while(label > 1) {
int lg = log2(label);
label = (3 * pow(2, lg) - 1 - label) / 2;
ans[lg - 1] = label;
}
return ans;
}
};