在一棵無限的二叉樹上,每個節點都有兩個子節點,樹中的節點 逐行 依次按 “之” 字形進行標記。
如下圖所示,在奇數行(即,第一行、第三行、第五行……)中,按從左到右的順序進行標記;
而偶數行(即,第二行、第四行、第六行……)中,按從右到左的順序進行標記。
給你樹上某一個節點的標號 label,請你返回從根節點到該標號為 label 節點的路徑,該路徑是由途經的節點標號所組成的。
示例 1:
輸入:label = 14
輸出:[1,3,4,14]
示例 2:
輸入:label = 26
輸出:[1,2,6,10,26]
解題思路
- 利用二叉樹的性質,編號為n的子節點,父節點為n/2(因為n為int,所以才可以這樣算),因此我們這題就是需要不斷往上找父節點
- 因為樹中的節點 逐行 依次按 “之” 字形進行標記,正常二叉樹編號每一層從左到右的順序進行標記,而偶數層在這題是相反的,但是我們可以把順序的節點映射為反序來加入結果列表,因此我們這次只需要按正常完全二叉樹的編號去尋找父節點,當遇到父節點在偶數層的時候,將節點映射為反序的加入結果列表。
代碼
class Solution {public List<Integer> pathInZigZagTree(int label) {int i=0;while (Math.pow(2,i)<=label){i++;}List<Integer> list=new ArrayList<>();i--;if (i%2==1){label=3* (int) Math.pow(2,i)-1-label;}while (i>=0){list.add(i%2==1?3* (int) Math.pow(2,i)-1-label:label);label/=2;i--;}Collections.reverse(list);return list;}
}