1104.二叉树寻路 力扣 LeetCode每日一题——c++ java python三种代码题解

题目链接:二叉树寻路
2021年7月29日 星期四

第一次写力扣每日一题题解,还是三种代码风格(c++,java,python)这几个比较热门的语言,算是一个挑战吧。希望自己能坚持下去,各位一起加油呀。

如有错误,烦请指正,闲话少叙,我们直接步入正题。
1104.二叉树寻路 力扣 LeetCode每日一题——c++ java python三种代码题解_第1张图片

经过观察和推理,我们可以得到几个结论如下

层数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 小染 
**2021729日 星期五 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))

你可能感兴趣的:(力扣题解)