1104. 二叉树寻路

本文详细介绍了如何解决二叉树寻路问题,特别是针对题目中给出的'之'字形标记的二叉树。通过分析二叉树的特性,利用二进制操作找到节点的对称位置,并通过除以2获取父节点。AC代码中展示了如何从给定节点标签构建路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1104. 二叉树寻路(题目链接:https://leetcode-cn.com/problems/path-in-zigzag-labelled-binary-tree/)
在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。(人话就是:根节点序号是1,下一层从左到右节点序号为
3、2,再下一层节点序号为4、5、6、7,再下一层15、14、13…8依次类推)
如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;
而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。
给你树上某一个节点的标号 label,请你返回从根节点到该标号为 label 节点的路径,该路径是由途经的节点标号所组成的。
示例 1:

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

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


满二叉树和二进制数有紧密的联系,二进制数最高位不变可以保证序号都处于同一层。观察正常有序的满二叉树,父节点可以由子节点除以2得到(向下取整),而题述的二叉树结构恰巧相反,可以由对称位置上节点序号除以二得到父节点序号。于是我们将问题转化为,给定了一个节点,怎么求对称节点,再除以2得到父节点。根据开始的描述,高位不变可以保证序号处于同一层,而将除最高位以外的其他所有位按位取反得到的就是对称位置上的节点,按位取反的操作可以通过异或1来完成,于是我们只用求出n除了最高位以外位数,假设有k位,则对称位置节点为n^((1<<k)-1)。


AC代码:

class Solution {
public:
    int getn(int n){
        int cnt=0;
        while (n)
        {
            cnt++;
            n/=2;
        }
        return cnt;
    }
    vector<int> pathInZigZagTree(int label) {
        vector<int>res;
        while (label>1)
        {
            res.push_back(label);
            int k=getn(label)-1;
            label^=((1<<k)-1);
            label>>=1;
        }
        res.push_back(1);
        reverse(res.begin(),res.end());
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值