解法一

如果是正常顺序的二叉树,那么对于结点i,其父结点就是i/2。但是在本题中,是蛇形的顺序,因此父结点要换成在本层中的对称位置。知道每层的最大值和最小值,就可以算出其对称结点。
从底向上找父结点得到的倒序的结果,最后需要进行反转。

  1. class Solution {
  2. public List<Integer> pathInZigZagTree(int label) {
  3. int depth = (int)Math.floor(Math.log(label) / Math.log(2));
  4. // 树每一层的最小值和最大值
  5. int[][] table = new int[depth][2];
  6. for (int i = 0, x = 1; i < depth; x *= 2, ++i) {
  7. table[i][0] = x;
  8. table[i][1] = x * 2 - 1;
  9. }
  10. // 倒序添加路径上的点
  11. List<Integer> ans = new ArrayList<>(depth + 1);
  12. ans.add(label);
  13. for (int i = depth - 1; i >= 0; --i) {
  14. label = table[i][0] + table[i][1] - label / 2;
  15. ans.add(label);
  16. }
  17. // 翻转得到正序路径
  18. Collections.reverse(ans);
  19. return ans;
  20. }
  21. }