1103. 二叉树寻路
原题
在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。
给你树上某一个节点的标号 label,请你返回从根节点到该标号为 label 节点的路径,该路径是由途经的节点标号所组成的。
示例 1:
1 2 3 |
输入:label = 14 输出:[1,3,4,14] |
示例 2:
1 2 3 |
输入:label = 26 输出:[1,2,6,10,26] |
提示:
+ 1 <= label <= 10^6
解题
先忽略他的“之” 字形, 按照正常序列遍历出那个固定点 curPositon(label), 然后根据性质, 偶数行翻转, 奇数行不变.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
class Solution { public: vector<int> pathInZigZagTree(int label) { vector<int> old; if(label <= 0) return old; // get line int line = 0; for(int i=0;;i++) { if(label < pow(2, i)) { line = i; break; } } // 判断当前 line 位置 int curPosition = label; if(line % 2 == 0) curPosition = (pow(2, line) - label -1) + (pow(2, line)/2); old.push_back(curPosition); for(int i=curPosition; i>1; i /= 2) old.insert(old.begin(), i/2); // 逆转 for(int i=0; i<old.size(); i++){ if((i+1) % 2 == 0) { old[i] = (pow(2, i+1) - old[i] -1) + (pow(2, i+1)/2); } } return old; } }; |