LeetCode题解1104.path-in-zigzag-labelled-binary-tree

题目地址

https://leetcode-cn.com/problems/path-in-zigzag-labelled-binary-tree/description/

题目描述

在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。

如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;

而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。

LeetCode题解1104.path-in-zigzag-labelled-binary-tree插图

给你树上某一个节点的标号 label,请你返回从根节点到该标号为 label 节点的路径,该路径是由途经的节点标号所组成的。

示例 1:

输入:label = 14
输出:[1,3,4,14]
示例 2:

输入:label = 26
输出:[1,2,6,10,26]

提示:

1 <= label <= 10^6

思路

假如这道题不是之字形,那么就会非常简单。 我们可以根据子节点的 label 轻松地求出父节点的 label,公示是 label // 2(其中 label 为子节点的 label)。

如果是这样的话,这道题应该是 easy 难度,代码也不难写出。我们继续考虑之字形。我们不妨先观察一下,找下规律。

LeetCode题解1104.path-in-zigzag-labelled-binary-tree插图(1)

以上图最后一行为例,对于 15 节点,之字变换之前对应的应该是 8 节点。14 节点对应的是 9 节点。。。

全部列举出来是这样的:

LeetCode题解1104.path-in-zigzag-labelled-binary-tree插图(2)

我们发现之字变换前后的 label 相加是一个定值。

LeetCode题解1104.path-in-zigzag-labelled-binary-tree插图(3)

因此我们只需要求解出每一层的这个定值,然后减去当前值就好了。(注意我们不需要区分偶数行和奇数行)
问题的关键转化为求解这个定值,这个定值其实很好求,因为每一层的最大值和最小值我们很容易求,而最大值和最小值的和正是我们要求的这个数字。

最大值和最小值这么求呢?由满二叉树的性质,我们知道每一层的最小值就是2 ** (level - 1),而最大值是2 ** level - 1。 因此我们只要知道 level 即可,level 非常容易求出,具体可以看下面代码。

关键点

  • 满二叉树的性质:
  1. 最小值是2 ** (level - 1),最大值是2 ** level - 1,其中 level 是树的深度。
  2. 假如父节点的索引为 i,那么左子节点就是 2*i, 右边子节点就是 2*i + 1。
  3. 假如子节点的索引是 i,那么父节点的索引就是 i // 2。
  • 先思考一般情况(不是之字形), 然后通过观察找出规律

代码

class Solution:
    def pathInZigZagTree(self, label: int) -> List[int]:
        level = 0
        res = []
        # for each level, ranged from 2 ** (level - 1) to 2 ** level - 1
        while 2 ** level - 1 < label:
            level += 1

        while level > 0:
            res.insert(0, label)
            label = 2 ** (level - 1) + 2 ** level - 1 - label
            label //= 2
            level -= 1
        return res
LeetCode题解103.binary-tree-zigzag-level-order-traversal

题目地址 https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/description/ 题目描述 和leetcode 102 基本是一样的,思路是完全一样的。 Given a binary tree, return the zigzag level order trav…

LeetCode题解104.maximum-depth-of-binary-tree

题目地址 https://leetcode.com/problems/maximum-depth-of-binary-tree/description/ 题目描述 Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the lo…

LeetCode题解102.binary-tree-level-order-traversal

题目地址 https://leetcode.com/problems/binary-tree-level-order-traversal/description/ 题目描述 Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to…

bulit-in gradle插件的版本号是多少? - java

在我的gradle构建文件中,我有以下插件块plugins { `java-library` jacoco checkstyle } 这些都没有指定版本,但是一切正常。假定一个项目正在使用gradle 6.0和gradle包装器,但是系统已安装gradle 5.0。问题:如果我运行gradle wrapper ./gradlew build,将会执行grad…

LeetCode题解1019.next-greater-node-in-linked-list

题目地址 https://leetcode-cn.com/problems/next-greater-node-in-linked-list/submissions/ 题目描述 给出一个以头节点 head 作为第一个节点的链表。链表中的节点分别编号为:node_1, node_2, node_3, ... 。 每个节点都可能有下一个更大值(next larg…