LeetCode——1104. 二叉树寻路(Path In Zigzag Labelled Binary Tree)[中等]——分析及代码(Java)

LeetCode——1104. 二叉树寻路[Path In Zigzag Labelled Binary Tree][中等]——分析及代码[Java]

一、题目

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

  • 在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;
  • 而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= label <= 10^6

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-in-zigzag-labelled-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 按位置求解

(1)思路

若所给二叉树的每一行都从左向右进行标记,则对节点 label,其父节点为 label / 2。

因此,可将二叉树先转换为全部从左向右标记的树,再根据各层节点的位置依次求解。

对奇数行的节点,转换前后标记相同;对偶数行第 row 行的节点 label,题中二叉树对应位置标记为 2^(row - 1) + 2^row - label - 1。

(2)代码

class Solution {
    public List<Integer> pathInZigZagTree(int label) {
        int row = 1;//行数
        while ((1 << row) <= label)//获得初始label对应的行数
            row++;
        if ((row & 1) == 0)//初始label位于偶数行,转换为从左到右标记时对应位置的值
            label = (1 << (row - 1)) + (1 << row) - label - 1;
        List<Integer> ans = new ArrayList<Integer>();
        for (; row > 0; row--) {//倒序求输出答案
            if ((row & 1) == 1)//奇数行,直接输出位置对应的标记
                ans.add(label);
            else//偶数行,按位置转换为从右到左的标记
                ans.add((1 << (row - 1)) + (1 << row) - label - 1);
            label >>= 1;//转为label的父节点
        }
        Collections.reverse(ans);//反转得到的路径
        return ans;//输出路径
    }
}

(3)结果

执行用时 :0 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :36.1 MB,在所有 Java 提交中击败了 50.22% 的用户。

三、其他

暂无。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值