1104. 二叉树寻路
- 原题链接:
- 完成情况:
- 解题思路:
- 参考代码:
- _1104二叉树寻路
- 错误经验吸取
原题链接:
1104. 二叉树寻路
https://leetcode.cn/problems/path-in-zigzag-labelled-binary-tree/description/
完成情况:
解题思路:
该函数实现了一个树节点在蜿蜒树中的路径查找。具体操作为:首先确定该节点所在的行数,并根据行数确定是否需要进行翻转操作;然后在路径中添加节点,并根据行数决定是否进行反转操作。最后将路径逆序输出。
函数参数为一个整数label,表示树节点的标签。首先确定该节点在整个蜿蜒树中的行数row和该行的起始值rowStart。接着判断是否需要进行翻转操作,如果行数为偶数,则调用getReverse函数对节点进行翻转。接着创建一个ArrayList用于存储路径,遍历每一行的节点值,并根据行数的奇偶性添加节点值或翻转节点值。最后将路径逆序输出并返回。
getReverse函数用于计算对应行数的节点翻转后的值,具体计算方式为:(1 << row - 1) + (1 << row) - 1 - label。
请注意,该代码使用了位运算和集合操作,需确保理解这两个方面的知识。
参考代码:
_1104二叉树寻路
package leetcode板块;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class _1104二叉树寻路 {
/**
* 在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;
* 偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。
*
* @param label
* @return 返回问的该序号的上述所有节点
*/
public List<Integer> pathInZigZagTree(int label) {
//按照指定要求,给树付序列号
//根据要求明确序列位置
int row = 1,rowStart = 1;
while (rowStart * 2 <= label){ //子节点必然小于等于label节点的一半
row++ ;
rowStart *=2;
}
if (row % 2 == 0){
label = getReverse(label,row);
}
//可以通过数值大小,来判断处于第几行
//通过知道处在第几行,就能进一步判断,是顺序,还是逆序
//加入链表,明确顺序
List<Integer> myPath = new ArrayList<Integer>();
while (row > 0){
if (row % 2 == 0){
myPath.add(getReverse(label,row));
}else {
myPath.add(label);
}
row--;
label >>= 1;
}
Collections.reverse(myPath);
return myPath;
}
/**
*
* @param label
* @param row
* @return
*/
private int getReverse(int label, int row) {
return (1 << row - 1) + (1 << row) - 1 - label;
}
}