在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。
如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;
而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。
给你树上某一个节点的标号 label,请你返回从根节点到该标号为 label 节点的路径,该路径是由途经的节点标号所组成的。
示例 1:
输入:label = 14
输出:[1,3,4,14]
示例 2:
输入:label = 26
输出:[1,2,6,10,26]
解题思路
- 利用二叉树的性质,编号为n的子节点,父节点为n/2(因为n为int,所以才可以这样算),因此我们这题就是需要不断往上找父节点
- 因为树中的节点 逐行 依次按 “之” 字形进行标记,正常二叉树编号每一层从左到右的顺序进行标记,而偶数层在这题是相反的,但是我们可以把顺序的节点映射为反序来加入结果列表,因此我们这次只需要按正常完全二叉树的编号去寻找父节点,当遇到父节点在偶数层的时候,将节点映射为反序的加入结果列表。
代码
class Solution {public List<Integer> pathInZigZagTree(int label) {int i=0;while (Math.pow(2,i)<=label){i++;}List<Integer> list=new ArrayList<>();i--;if (i%2==1){label=3* (int) Math.pow(2,i)-1-label;}while (i>=0){list.add(i%2==1?3* (int) Math.pow(2,i)-1-label:label);label/=2;i--;}Collections.reverse(list);return list;}
}