题目
在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。
如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;
而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。
给你树上某一个节点的标号 label,请你返回从根节点到该标号为 label 节点的路径,该路径是由途经的节点标号所组成的。
示例 1:
输入:label = 14
输出:[1,3,4,14]
示例 2:
输入:label = 26
输出:[1,2,6,10,26]
提示:
1 <= label <= 10^6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-in-zigzag-labelled-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
class Solution {
public void rever(int[] arr,int left,int right){
int len = right-left+1;
for(int i=0;i<len/2;i++){
int tmp = arr[i+left];
arr[i+left] = arr[left+len-i-1];
arr[left+len-i-1] = tmp;
}
}
public List<Integer> pathInZigZagTree(int label) {
List<Integer> ans = new ArrayList<>();
if(label==1){
ans.add(1);
return ans;
}
int[] arr;
for(int i=0;;i++){
if((int)(Math.pow(2,i))>label){
arr = new int[(int)(Math.pow(2,i))];
break;
}
}
for(int i=0;i<arr.length;i++){
arr[i] = i;
}
for(int i=1;(int)(Math.pow(2,i))<=arr.length;i+=2){
int left = (int)Math.pow(2,i),right = (int)(Math.pow(2,i+1)-1);
if(left<0||left>=arr.length||right>=arr.length) break;
rever(arr,left,right);
}
int n=0;
for(int i=0;;i++){
if(arr[i]==label){
n = i;
break;
}
}
while(n!=0){
ans.add(arr[n]);
if(n%2==0){
n/=2;
}else{
n = (n-1)/2;
}
}
for(int i=0;i<ans.size()/2;i++){
int tmp = ans.get(i);
ans.set(i,ans.get(ans.size()-i-1));
ans.set(ans.size()-i-1,tmp);
}
return ans;
}
}