在一棵無限的二叉樹上,每個節點都有兩個子節點,樹中的節點 逐行 依次按 「之」 字形進行標記。
如下圖所示,在奇數行(即,第一行、第三行、第五行……)中,按從左到右的順序進行標記;
而偶數行(即,第二行、第四行、第六行……)中,按從右到左的順序進行標記。
給你樹上某乙個節點的標號 label,請你返回從根節點到該標號為 label 節點的路徑,該路徑是由途經的節點標號所組成的。
示例 1:
輸入:label = 14
輸出:[1,3,4,14]
示例 2:
輸入:label = 26
輸出:[1,2,6,10,26]
1 <= label <= 10^6
思路:從低到上,依次將label除以2即可得到對應父節點,但由於偶數行和奇數行順序相反,如果label初始時在奇數行,則求得的父節點要在偶數行置反,反之要置反其奇數行。置反時,由於他們的對稱關係可知,左邊某節點其左邊界的距離等於其置反節點在右邊界的距離。可得求置反結點的公式t = pow(2, i ) -1 - tmp[i - 1] + pow(2, i - 1),t為tmp[i - 1]的置反節點,,i為層數, tmp[i - 1]為要置反的節點,pow(2, i ) -1為右邊界,pow(2, i - 1)為左邊界 。因為深度為k的完全二叉樹的結點個數為pow(2, i) - 1個, 所以可求出置反節點所在行的節點取值範圍為pow(2, i) - 1 - pow(2, i - 1) - 1。
**如下:
class solution(object):
def pathinzigzagtree(self, label):
""":type label: int
:rtype: list[int]
"""if label == 1:
return [1]
tmp =
while label > 0:
label //= 2
tmp = tmp[::-1]
#print(tmp)
n = len(tmp)
*** = n % 2 # 初始label偶數行,置反奇數行位置,反之置反偶數行位置
for i in range(1, n):
if i % 2 == ***:
t = pow(2, i + 1) -1 - tmp[i] + pow(2, i)
tmp[i] = t
print(tmp)
return tmp
x = solution()
x.pathinzigzagtree(26)
輸出結果: [1, 2, 6, 10, 26] 二叉樹尋路
在一棵無限的二叉樹上,每個節點都有兩個子節點,樹中的節點 逐行 依次按 之 字形進行標記。如下圖所示,在奇數行 即,第一行 第三行 第五行 中,按從左到右的順序進行標記 而偶數行 即,第二行 第四行 第六行 中,按從右到左的順序進行標記。給你樹上某乙個節點的標號 label,請你返回從根節點到該標號...
leetcode 二叉樹尋路 細節
在一棵無限的二叉樹上,每個節點都有兩個子節點,樹中的節點 逐行 依次按 之 字形進行標記。如下圖所示,在奇數行 即,第一行 第三行 第五行 中,按從左到右的順序進行標記 而偶數行 即,第二行 第四行 第六行 中,按從右到左的順序進行標記。給你樹上某乙個節點的標號 label,請你返回從根節點到該標號...
python 二叉樹查詢 Python二叉樹搜尋
stack depth is initialised to 0 def find in tree node,find condition,stack depth assert stack depth max stack depth deeper than max depth stack depth ...