1104 二叉樹尋路 python

2021-09-27 06:35:00 字數 1484 閱讀 7505

在一棵無限的二叉樹上,每個節點都有兩個子節點,樹中的節點 逐行 依次按 「之」 字形進行標記。

如下圖所示,在奇數行(即,第一行、第三行、第五行……)中,按從左到右的順序進行標記;

而偶數行(即,第二行、第四行、第六行……)中,按從右到左的順序進行標記。

給你樹上某乙個節點的標號 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 ...