题目描述:
示例 1:
示例 2:
思路一:
class Solution {
public List<Integer> list = new ArrayList();
public List<Integer> pathInZigZagTree(int label) {
Map<Integer, Integer> map = new HashMap();
map.put(1, 1); // 初始化第一行与第一行元素个数关系.
int row = 1, count = 1, sum = 1;
int[] arr = new int[10000000];
arr[0] = 1;
int i = 1, mark = 0;
while (count < label) {
row++; // 行数
count *= 2; // 计算每行数据
int one = sum + 1;
sum += count; // 总数据.
int two = sum;
int index = count;
// if (count < label) {
while (index-- > 0) {
if (row % 2 == 0) {
arr[i++] = two--;
if (arr [i - 1] == label) {
mark = i - 1;
}
} else {
arr[i++] = one++;
if (arr[i - 1] == label) {
mark = i - 1;
}
}
}
}
List<Integer> result = new ArrayList();
while (mark > 0) {
result.add(arr[mark]); // 根据索引获取元素.
mark--;
mark /= 2; // 获取父节点索引.
}
result.add(1);
Collections.reverse(result);
return result;
}
}
思路二:
代码实现:
class Solution {
public List<Integer> list = new ArrayList();
public Map<Integer, Integer> map = new HashMap();
public List<Integer> pathInZigZagTree(int label) {
int count = 1, row = 1, sum = 1;
list.add(label);
map.put(1, 1); // 初始化第一行与第一行元素个数关系.
while (sum < label) {
row++; // 当前行;
count *= 2; //当前行元素个数.
sum += count; // 元素总数
map.put(row, count); // 维护行数与当前行元素个数关系.
}
List<Integer> result = new ArrayList();
label = map.get(row) - label + sum; // 获取label对称元素.
while (row > 0) {
int index = map.get(row); // 获取当前行元素个数.
label = index - label + sum; // 获取对称元素.
result.add(label);
sum -= index;
label /= 2; // 获取父节点的对称元素.
row--;
}
Collections.reverse(result);
return result;
}
}