LeetCode题解:Path In Zigzag Labelled Binary Tree

栏目: 数据库 · 发布时间: 5年前

内容简介:一棵无穷的二叉树,每个节点都编号(label)了:对于奇数层(第1、3、5等层),从左向右编号。对于偶数层,从右向左编号。但是每层的编号还是最小如图:

本文为LeetCode 1104. Path In Zigzag Labelled Binary Tree 的题解。

题目描述

一棵无穷的二叉树,每个节点都编号(label)了:对于奇数层(第1、3、5等层),从左向右编号。对于偶数层,从右向左编号。但是每层的编号还是最小 2^(level-1) ,最大 2^level-1

如图:

LeetCode题解:Path In Zigzag Labelled Binary Tree

给你一个编号(label),输出从顶层到该节点经过的节点编号。

Example 1:

<strong>Input:</strong> label = 14
<strong>Output:</strong> [1,3,4,14]

Example 2:

<strong>Input:</strong> label = 26
<strong>Output:</strong> [1,2,6,10,26]

思路

  1. 给定节点,我们可以知道节点在第几层
  2. 给定正常树中的编码,可以知道父节点的编号。
  3. 给定正常树中的编码,可以知道在该变异树中的节点编号。

第一点是显而易见的, log(label) 即为层数。

第二点,正常节点的值label除以2即为父节点的label。

对于第三点,在level层,变异树中的节点label和正常树的节点label(也就是树中堆成位置的节点)之和为 2^(level-1)*3-1

比如图中第四层,14节点在正常编码的时候是9, 14+9=2^(4-1)*3-1=23

这样,我们只需要在正常树中向上回溯到根节点就好,只是在放结果的时候,转化为变异树的label值即可。

代码

import java.util.Arrays;
import java.util.List;

class Solution {
    /**
     * 计算label节点在第几层
     */
    private int level(int label) {
        int level = 0;
        while (label != 0) {
            level += 1;
            label >>= 1;
        }
        return level;
    }

    /**
     * 计算第level层的label节点变换后的位置
     * <p>
     * 如果输入变异节点,则输出正常节点
     * 反之亦然
     */
    private int normalLabel(int label, int level) {
        if (level % 2 == 0) {
            int base = 1 << (level - 1);
            int sum = base * 3 - 1;
            label = sum - label;
        }
        return label;
    }

    public List<Integer> pathInZigZagTree(int label) {
        int totelLevel = level(label);
        Integer[] res = new Integer[totelLevel];

        // 我们需要在正常树中回溯
        // 故先将输入节点替换为正常树中的节点
        label = normalLabel(label, totelLevel);

        // 树的回溯
        while (label != 0) {
            int level = level(label);
            res[level - 1] = normalLabel(label, level);
            label /= 2;
        }
        return Arrays.asList(res);
    }

    public static void main(String[] args) {
        List<Integer> res = new Solution().pathInZigZagTree(33);
        System.out.println(res);
        // 输出 [1, 2, 7, 8, 31, 33]
    }
}

以上所述就是小编给大家介绍的《LeetCode题解:Path In Zigzag Labelled Binary Tree》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

众声喧哗

众声喧哗

胡泳 / 广西师范大学出版社 / 2008-9 / 35.00元

本书触及了网络政治学中的一个重大话题——网络空间中的私域与公域。随着科技的进步,在信息时代的开端,公与私的含义和边界都出现了不容忽视的游移。《众声喧哗》主要探讨,经由新的共有媒体的作用,传统的公私两分如何在社会和政治的双重压力下产生消长和易位。在这里,公域与私域不能看做结构性的东西,而必须视之为一种流和一种过程。在网络时代,我们既要追求生机勃勃的公共生活,又要保证私人领域一定的自主性。共有媒体也许......一起来看看 《众声喧哗》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试