1104. 二叉树寻路
题意:
在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。
如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;
而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。
给你树上某一个节点的标号
label
,请你返回从根节点到该标号为label
节点的路径,该路径是由途经的节点标号所组成的。
示例 1:
输入:label = 14
输出:[1,3,4,14]
示例 2:
输入:label = 26
输出:[1,2,6,10,26]
解题思路:
这道题其实本质就是数学题,也就是找规律.看了许久总算看出来了规律
问 答 要怎么确定它的父节点? 先用 label
减 2层数 然后再除以2
,这样就可以得到它父节点的相对位置.怎么确定父节点的值? 需要先判断label所在的层次.奇数层和偶数层分开处理(在代码中详细说明)
- 这里只要找出相应的规律就可以完成问题.
代码:
class Solution {
public:
vector<int> pathInZigZagTree(int label) {
vector<int> res;
//先压入最后一个节点
res.push_back(label);
//1og以2为底的对数形式向下取整,获得所在层数
int depth = log(label)/log(2);
//先减去它所在层数的值,配合下面的除以2.
label = label - pow(2, depth);
//如果是偶数层,需要从左边开始数
if (depth % 2 == 0)
{
while (depth > 0)
{
//得到父亲节点的相对位置
label = label / 2;
//如果是计数层就是,左边是最小值,需要加上相对位置即可得到父系节点
if (depth % 2 != 0)
res.push_back(pow(2, depth - 1) + label);
//左边节点为最大值 <pow(2, depth) - 1> ,减去相对位置即可得到父系节点
else
res.push_back(pow(2, depth) - 1 - label);
//层数每次都要往上一层
depth--;
}
}
//奇数层开始,从右边开始数,也就是跟偶数层相反
else
{
while (depth > 0)
{
label = label / 2;
if (depth % 2 != 0)
res.push_back(pow(2, depth) - 1 - label);
else
res.push_back(pow(2, depth - 1) + label);
depth--;
}
}
//从下往上压,需要翻转
reverse(res.begin(), res.end());
return res;
}
};
总结:
这道题是找规律题,只需要耐心寻找一下不难发现这个规律.这样找的结果时间复杂度很低,O(log2n),所以运行时间为0ms.