题目描述:
在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。
如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;
而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。
给你树上某一个节点的标号 label,请你返回从根节点到该标号为 label 节点的路径,该路径是由途经的节点标号所组成的。
示例 1:
输入:label = 14
输出:[1,3,4,14]
题源:https://leetcode-cn.com/problems/path-in-zigzag-labelled-binary-tree/
在数学上,下标为k的节点,则其父节点是k/2取整。
代码:
class Solution { public: vector<int> pathInZigZagTree(int label) { int l=0; long long sum=1,pos; vector<int> res; res.push_back(label); if (label==1) return res; for(int i=1;i<30;i++) // 判断第几层 { sum*=2; l++; if(sum>label) break; } if(l%2==0) pos=sum/2-1+sum-label; // 判断label的起始位置 else pos=label; for(int i=l-1;i>0;i--) { if (i==1) {res.push_back(1); break;} if (i%2==1) {res.push_back(pos/2); pos/=2; sum/=2;} //奇数层是没有翻转的 else // 偶数层,会进行翻转 { res.push_back(sum/4-1+sum/2-pos/2); pos=pos/2; sum/=2; } } reverse(res.begin(),res.end()); return res; } };