[leetcode]1104. Path In Zigzag Labelled Binary Tree

因为不管是奇数行还是偶数行,该行与上一行的方向都是反着来的

可以先求出顺着来时这个结点对应的父结点,再求出对应父结点在它所在行对称的结点

这里有个求对称的方法:按顺序排列且每个数都能找到对称数的一系列数,每一对对陈数的和都相同,所以求某个数的在某一行的对称数,只用找出这一行两端的数,求出和,再减去这个数就能得到这个数的对称数

所以只用从传进来的这个结点递归,每次递归求出自己对应的父结点,递归到1时结束,每次递归记录一次当前结点的号码

最后得到的一系列结点号码就是路径

class Solution {
public:
    vector<int> res;
    vector<int> pathInZigZagTree(int label) {
        helper(label);
        return res;
    }
    
    void helper(int label){
        int level;
        int lastMin;
        if(label == 1)
            res.insert(res.begin(), label);
        else{
            res.insert(res.begin(), label);
            level = (int)(log(label)/log(2));   //上一层的层数
            lastMin = pow(2, level)/2;          //上一层最小的数
            
            helper( lastMin + (lastMin*2)-1 - label/2 );
        }
    }
};
原文地址:https://www.cnblogs.com/ssNiper/p/11208258.html