1. 程式人生 > 其它 >從上到下輸出二叉樹中每一層最右邊的節點(廣度優先遍歷)

從上到下輸出二叉樹中每一層最右邊的節點(廣度優先遍歷)

題目描述:

從上到下輸出二叉樹中每一層最右邊的節點。如下圖二叉樹:

輸入為[1,2,3,4,5,'null',6,'null','null',7]

要求輸出為:[1,3,6,7]

題目分析:

我們需要對二叉樹進行分層,因為只有分層之後才能準確地對每一層的節點進行遍歷,尋找到最右邊的節點。
通過廣度優先搜尋演算法,我們可以根據其層次性取出每一層的資料,然後把每層的結果(最右邊的節點)加入最終結果中。現在我們為每個節點設定一個層級,比如根節點的層級是第 1 層,根節點的子節點的層級是第 2 層,再往下的節點的層級依次遞增。

這個題目可以說是二叉樹廣度優先搜尋問題的一種變形,我們只需要將一整層放入佇列,尋找到最右邊的節點,再通過佇列中的節點更新下一層的節點,將所有下一層的節點放入佇列,並把前一層的節點移出佇列,直到沒有節點可以加入佇列,佇列為空為止。既然是廣度優先搜尋演算法,那麼一定要用到佇列,使用佇列來儲存待處理的節點。廣度優先搜尋演算法程式碼的第一個核心是先取出每層的節點,然後處理該節點,之後把下一層的子節點都存入佇列並移出上層已處理的節點,以此類推,直到佇列為空,處理就完畢了。
為了保證廣度優先搜尋是一層層遍歷,而不是按遍歷的節點到根節點的距離的遠近來遍歷,需更新佇列的時候加入一層 for 迴圈,保證這一層的節點均已用於更新下一層節點並已被移出佇列。

廣度優先搜尋演算法程式碼的第二個核心便是如何找到每層的最右邊一個節點。為了最方便快捷地尋找到題目所要求的節點,建議使用 list 列表來模擬佇列,原因很簡單:當一個佇列只儲存一層節點時,使用 list 列表可以直接訪問隊尾的節點,也就是該層最右邊的節點,從而直接找到題目要求的答案。

程式碼:

class Treenode:
def __init__(self,val):
self.val=val
self.left=None
self.right=None

def bfs(root):
res=[]
queue=[root]
while queue:
level_size=len(queue)
res.append(queue[-1].val)
for i in range(level_size):
top=queue.pop(0)
if top.left:
queue.append(top.left)
if top.right:
queue.append(top.right)
return res

tree=[]
Input=input().split()
cnt=1
for item in Input:
temp=Treenode(item)
tree.append(temp)

for item in tree:
if item.val=='null':
continue
if 2*cnt<=len(Input) and tree[2*cnt-1]!='null':
item.left=tree[2*cnt-1]
if 2*cnt+1<=len(Input) and tree[2*cnt]!='null':
item.right=tree[2*cnt]
cnt+=1

ans=bfs(tree[0])
print(ans)