LeetCode 1104 二叉树寻路

在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。

如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;

而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。

给你树上某一个节点的标号 label,请你返回从根节点到该标号为 label 节点的路径,该路径是由途经的节点标号所组成的。

示例 1:

输入:label = 14
输出:[1,3,4,14]

示例 2:

输入:label = 26
输出:[1,2,6,10,26]

采用普通顺序构造的话,其上一层父节点就是直接/2 就行了,而题目中采用的是“之”字型构造,也就是找到同一层和其对称的节点,再/2就可以找到其上一层对应的父节点了

/**
 * 对称点
 *
 * @param label
 * @return
 */
public static List<Integer> pathInZigZagTree(int label) {
    if (label == 0) return new ArrayList<>();

    // Label的上一层:2的level次幂等于第level层的起始数(同一层的最小值,),从而根据这个可得出label所在的层数
    int level = (int) (Math.log(label) / Math.log(2)) + 1;

    List<Integer> integers = new ArrayList<>();
    while (label > 0) {
        integers.add(label);
        // 不断计算上一层的对称点
        label = (int) (Math.pow(2, level) - 1 - label + Math.pow(2, level - 1));
        // 普通顺序构造的情况下,对应上一层的数,也就是普通顺序构造下的父节点
        label /= 2;
        // 上一层
        --level;
    }
    // list翻转
    Collections.reverse(integers);
    return integers;
}

测试用例

public static void main(String[] args) {
    int label = 14;
    List<Integer> integerList = PathInZigZagTree.pathInZigZagTree(label);
    System.out.print("PathInZigZagTree demo01 result : [");
    for (Integer integer : integerList) {
        System.out.print("," + integer);
    }
    System.out.println("]");

    label = 26;
    integerList = PathInZigZagTree.pathInZigZagTree(label);
    System.out.print("PathInZigZagTree demo02 result : [");
    for (Integer integer : integerList) {
        System.out.print("," + integer);
    }
    System.out.println("]");
}

运行结果

PathInZigZagTree demo01 result : [,1,3,4,14]
PathInZigZagTree demo02 result : [,1,2,6,10,26]
原文地址:https://www.cnblogs.com/fyusac/p/15074031.html