解法一
如果是正常顺序的二叉树,那么对于结点i,其父结点就是i/2。但是在本题中,是蛇形的顺序,因此父结点要换成在本层中的对称位置。知道每层的最大值和最小值,就可以算出其对称结点。
从底向上找父结点得到的倒序的结果,最后需要进行反转。
class Solution {public List<Integer> pathInZigZagTree(int label) {int depth = (int)Math.floor(Math.log(label) / Math.log(2));// 树每一层的最小值和最大值int[][] table = new int[depth][2];for (int i = 0, x = 1; i < depth; x *= 2, ++i) {table[i][0] = x;table[i][1] = x * 2 - 1;}// 倒序添加路径上的点List<Integer> ans = new ArrayList<>(depth + 1);ans.add(label);for (int i = depth - 1; i >= 0; --i) {label = table[i][0] + table[i][1] - label / 2;ans.add(label);}// 翻转得到正序路径Collections.reverse(ans);return ans;}}
