LeetCode 116: 填充每個節點的下一個右側節點指針
給定一個完美二叉樹,其所有葉子節點都在同一層,每個父節點都有兩個子節點。二叉樹定義如下: struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每個 next 指針,讓這個指針指向其下一個右側節點。如果找不到下一個右側節點,則將 next 指針設置爲 NULL。 初始狀態下,所有 next 指針都被設置爲 NULL。 示例:
解釋:給定二叉樹如圖 A 所示,你的函數應該填充它的每個 next 指針,以指向其下一個右側節點,如圖 B 所示。 提示: 你只能使用常量級額外空間。 使用遞歸解題也符合要求,本題中遞歸程序佔用的棧空間不算做額外的空間複雜度。
思路: 基於層次遍歷,每遍歷一層,依次將節點的.next = 下一節點,最後一個節點=None
定義結構:
class Node:
def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
self.val = val
self.left = left
self.right = right
self.next = next
基於層次遍歷代碼實現:
class Solution:
def connect(self, root: 'Node') -> 'Node':
# 層次遍歷
if not root: return None
cur_level = [root]
while cur_level:
temp,next_level=[],[]
for node in cur_level:
temp.append(node) # 添加本層節點
if node.left: next_level.append(node.left)
if node.right: next_level.append(node.right)
temp.append(None) # 在最後一個位置處添加 None,便於循環
for i in range(len(temp)-1):
temp[i].next=temp[i+1]
cur_level = next_level
return root