因为不管是奇数行还是偶数行,该行与上一行的方向都是反着来的
可以先求出顺着来时这个结点对应的父结点,再求出对应父结点在它所在行对称的结点
这里有个求对称的方法:按顺序排列且每个数都能找到对称数的一系列数,每一对对陈数的和都相同,所以求某个数的在某一行的对称数,只用找出这一行两端的数,求出和,再减去这个数就能得到这个数的对称数
所以只用从传进来的这个结点递归,每次递归求出自己对应的父结点,递归到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 ); } } };