LeetCode——1104. 二叉树寻路[Path In Zigzag Labelled Binary Tree][中等]——分析及代码[Java]
一、题目
在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。
- 在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;
- 而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。
给你树上某一个节点的标号 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 按位置求解
(1)思路
若所给二叉树的每一行都从左向右进行标记,则对节点 label,其父节点为 label / 2。
因此,可将二叉树先转换为全部从左向右标记的树,再根据各层节点的位置依次求解。
对奇数行的节点,转换前后标记相同;对偶数行第 row 行的节点 label,题中二叉树对应位置标记为 2^(row - 1) + 2^row - label - 1。
(2)代码
class Solution {
public List<Integer> pathInZigZagTree(int label) {
int row = 1;//行数
while ((1 << row) <= label)//获得初始label对应的行数
row++;
if ((row & 1) == 0)//初始label位于偶数行,转换为从左到右标记时对应位置的值
label = (1 << (row - 1)) + (1 << row) - label - 1;
List<Integer> ans = new ArrayList<Integer>();
for (; row > 0; row--) {//倒序求输出答案
if ((row & 1) == 1)//奇数行,直接输出位置对应的标记
ans.add(label);
else//偶数行,按位置转换为从右到左的标记
ans.add((1 << (row - 1)) + (1 << row) - label - 1);
label >>= 1;//转为label的父节点
}
Collections.reverse(ans);//反转得到的路径
return ans;//输出路径
}
}
(3)结果
执行用时 :0 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :36.1 MB,在所有 Java 提交中击败了 50.22% 的用户。
三、其他
暂无。