LeetCode题解:Path In Zigzag Labelled Binary Tree

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

内容简介:一棵无穷的二叉树,每个节点都编号(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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Effective JavaScript

Effective JavaScript

赫尔曼 (David Herman) / 黄博文、喻杨 / 机械工业出版社 / 2014-1-1 / CNY 49.00

Effective 系列丛书经典著作,亚马逊五星级畅销书,Ecma 的JavaScript 标准化委员会著名专家撰写,JavaScript 语言之父、Mozilla CTO —— Brendan Eich 作序鼎力推荐!作者凭借多年标准化委员会工作和实践经验,深刻辨析JavaScript 的内部运作机制、特性、陷阱和编程最佳实践,将它们高度浓缩为极具实践指导意义的 68 条精华建议。 本书共......一起来看看 《Effective JavaScript》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具