题目链接:二叉树寻路
2021年7月29日 星期四
第一次写力扣每日一题题解,还是三种代码风格(c++,java,python)这几个比较热门的语言,算是一个挑战吧。希望自己能坚持下去,各位一起加油呀。
经过观察和推理,我们可以得到几个结论如下
层数level与label的关系: 2level>label 所以我们可以用一个简单的循环求得层数
奇数层 即(level%2)==1 时 该层数为排列 [ 2level-1 , 2level-1 ]
比如第三层 为 4 5 6 7
偶数层 即(level%2)==0 时 该层数为排列 [ 2level - 1 , 2level-1 ]
比如第四层 为 15 14 13 12 11 10 9 8
label在该层的第几个位置(pos)?(从1开始计数,便于思考,防止出错)
偶数层时,pos=2level-label ,如第四层的14在第二个
奇数层时,pos=label-2level-1+1 , 如第三层的6在三个
第level层的位置为第pos个,那么level-1层呢?
由于这是一个二叉树,不难看出,第level-1层,他的父节点假设为father,该节点假设为son
则父节点的位置 pos(father) =( pos(son) + 1 ) ÷ 2
到这里,需要的结论我们已经梳理完了,下面上代码,看总体的代码实现
c++代码
/*
**by 小染
**2021年7月29日 星期四 21:31
*/
class Solution {
public:
vector<int> pathInZigZagTree(int label) {
int p=1,level=0;//level记录该值在第几层
vector<int> res;
while(label>=p){
p*=2;
level++;
}
stack<int> stk;
//由于我们是逆向求解的,所以我这里用了一个栈(先进后出)存储结果再存到vector中,大家用其他方式也可以
int pos=(level%2) ? label-pow(2,level-1)+1 : pow(2,level)-label ;
//记录这个数在第level层的第几个
//level-1层中 label的父节点一定是level-1层第(pos+1)/2个
int lab=label;
while(level){
lab=(level%2)? pow(2,level-1)+pos-1 : pow(2,level)-pos;
stk.push(lab);
level--;
pos=(pos+1)/2;
}
while(!stk.empty()){
res.push_back(stk.top());
stk.pop();
}
return res;
}
};
java代码
/*
**by 小染
**2021年7月29日 星期五 0:30
*/
class Solution {
public List<Integer> pathInZigZagTree(int label) {
int p=1,level=0;//level记录该值在第几层
List<Integer> res=new ArrayList<Integer>();
while(label>=p){
p*=2;
level++;
}
Stack<Integer> stk=new Stack();
//记录这个数在第level层的第几个
//level-1层中 label的父节点一定是level-1层第(pos+1)/2个
int pos=(level%2==1) ? (label-(int)Math.pow(2,level-1)+1) :((int)Math.pow(2,level)-label);//记录这个数在第level层的第几个
//level-1层中 label的父节点一定是level-1层第(w+1)/2个
int lab=label;
while(level!=0){
lab=(level%2==1)? (int)Math.pow(2,level-1)+pos-1 : (int)Math.pow(2,level)-pos;
stk.push(lab);
level--;
pos=(pos+1)/2;
}
while(!stk.empty()){
res.add(stk.peek());
stk.pop();
}
return res;
}
}
python代码
/*
**by 小染
**2021年7月29日 星期五 0:30
*/
class Solution:
def pathInZigZagTree(self, label: int) -> List[int]:
p=1
level=0#level记录该值在第几层
res = []
while label>=p:
p*=2
level+=1
pos = label-2**(level-1)+1 if(level%2==1) else 2**level-label
#pos记录这个数在第level层的第几个位置
lab = label
while level!=0:
lab = 2**(level-1)+pos-1 if(level%2==1) else 2**level-pos
res.append(lab)
level-=1
pos=int((pos+1)/2)
return list(reversed(res))