LeetCode 1104 二叉树寻路
在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。
如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;
而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。
给你树上某一个节点的标号 label
,请你返回从根节点到该标号为 label
节点的路径,该路径是由途经的节点标号所组成的。
示例 1:
输入:label = 14 输出:[1,3,4,14]
示例 2:
输入:label = 26 输出:[1,2,6,10,26]
采用普通顺序构造的话,其上一层父节点就是直接/2 就行了,而题目中采用的是“之”字型构造,也就是找到同一层和其对称的节点,再/2就可以找到其上一层对应的父节点了
/**
* 对称点
*
* @param label
* @return
*/
public static List<Integer> pathInZigZagTree(int label) {
if (label == 0) return new ArrayList<>();
// Label的上一层:2的level次幂等于第level层的起始数(同一层的最小值,),从而根据这个可得出label所在的层数
int level = (int) (Math.log(label) / Math.log(2)) + 1;
List<Integer> integers = new ArrayList<>();
while (label > 0) {
integers.add(label);
// 不断计算上一层的对称点
label = (int) (Math.pow(2, level) - 1 - label + Math.pow(2, level - 1));
// 普通顺序构造的情况下,对应上一层的数,也就是普通顺序构造下的父节点
label /= 2;
// 上一层
--level;
}
// list翻转
Collections.reverse(integers);
return integers;
}
测试用例
public static void main(String[] args) {
int label = 14;
List<Integer> integerList = PathInZigZagTree.pathInZigZagTree(label);
System.out.print("PathInZigZagTree demo01 result : [");
for (Integer integer : integerList) {
System.out.print("," + integer);
}
System.out.println("]");
label = 26;
integerList = PathInZigZagTree.pathInZigZagTree(label);
System.out.print("PathInZigZagTree demo02 result : [");
for (Integer integer : integerList) {
System.out.print("," + integer);
}
System.out.println("]");
}
运行结果
PathInZigZagTree demo01 result : [,1,3,4,14]
PathInZigZagTree demo02 result : [,1,2,6,10,26]