zoukankan      html  css  js  c++  java
  • 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]
    
  • 相关阅读:
    SpringBoot系列之切换log4j日志框架
    SpringBoot系列之日志框架使用教程
    SpringBoot系列之集成logback实现日志打印(篇二)
    源码学习系列之SpringBoot自动配置(篇二)
    SpringBoot系列之@Conditional注解用法简介
    7.Maven命令
    6.Maven构建过程的各个环节
    5.Maven坐标
    4.用IntelliJ IDEA 创建Maven Web
    3.用IntelliJ IDEA 创建Maven
  • 原文地址:https://www.cnblogs.com/fyusac/p/15074031.html
Copyright © 2011-2022 走看看