【树】B036_LC_二叉树寻路(找规律)

一、Problem

【树】B036_LC_二叉树寻路(找规律)_第1张图片

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

1 <= label <= 10^6

二、Solution

方法一:规律

某一个结点 X X X 的父节点 f a fa fa 的求法:
f a = l e f t + r i g h t − X 2 fa = left + right - \cfrac{X}{2} fa=left+right2X
l e f t 、 r i g h t left、right leftright 的求法:
l e f t = 2 d − 1 ; r i g h t = 2 d − 1 ( d ⩾ 0 , 结 点   X   深 度 ) left = 2^d-1;right = 2^{d-1} (d \geqslant 0,结点\ X\ 深度) left=2d1right=2d1d0 X 
结点 X X X 的深度的求法:
d = l o g 2 X = l o g e X l o g e 2 d = log_2X = \cfrac{log_eX}{log_e2} d=log2X=loge2logeX

class Solution {
    public List<Integer> pathInZigZagTree(int x) {
        LinkedList<Integer> q = new LinkedList<>();
        q.add(x);
        int d = (int) (Math.log(x) / Math.log(2));

        while (d > 0) {
            x = (int) Math.pow(2, d)-1 + (int) Math.pow(2, d-1) - x/2;
            q.addFirst(x);
            d--;
        } 
        return q;
    }
}

复杂度分析

  • 时间复杂度: O ( . . . ) O(...) O(...)
  • 空间复杂度: O ( d ) O(d) O(d)

你可能感兴趣的:(#,树)