• 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]
    
  • 相关阅读:
    使用json-lib进行Java和JSON之间的转换
    PHP实现RabbitMQ消息队列(转)
    PHP错误日志和内存查看(转)
    linux下安装python3(转)
    如何在Linux上设置SSH密码以进行无密码登录(转)
    事务的ACID特性(转)
    PHP之缓存雪崩,及解决方法(转)
    php字符串统计次数的各种方法(转)
    php批量检测和去掉bom头(转)
    go延时队列
  • 原文地址:https://www.cnblogs.com/fyusac/p/15074031.html
Copyright © 2020-2023  润新知