内容简介:一棵无穷的二叉树,每个节点都编号(label)了:对于奇数层(第1、3、5等层),从左向右编号。对于偶数层,从右向左编号。但是每层的编号还是最小如图:
本文为LeetCode 1104. Path In Zigzag Labelled Binary Tree 的题解。
题目描述
一棵无穷的二叉树,每个节点都编号(label)了:对于奇数层(第1、3、5等层),从左向右编号。对于偶数层,从右向左编号。但是每层的编号还是最小 2^(level-1)
,最大 2^level-1
。
如图:
给你一个编号(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]
思路
- 给定节点,我们可以知道节点在第几层
- 给定正常树中的编码,可以知道父节点的编号。
- 给定正常树中的编码,可以知道在该变异树中的节点编号。
第一点是显而易见的, 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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
代码大全(第2版)
[美] 史蒂夫·迈克康奈尔 / 金戈、汤凌、陈硕、张菲 译、裘宗燕 审校 / 电子工业出版社 / 2006-3 / 128.00元
第2版的《代码大全》是著名IT畅销书作者史蒂夫·迈克康奈尔11年前的经典著作的全新演绎:第2版不是第一版的简单修订增补,而是完全进行了重写;增加了很多与时俱进的内容。这也是一本完整的软件构建手册,涵盖了软件构建过程中的所有细节。它从软件质量和编程思想等方面论述了软件构建的各个问题,并详细论述了紧跟潮流的新技术、高屋建瓴的观点、通用的概念,还含有丰富而典型的程序示例。这本书中所论述的技术不仅填补了初......一起来看看 《代码大全(第2版)》 这本书的介绍吧!