Difficulty: 中等node
給定一個 **完美二叉樹 **,其全部葉子節點都在同一層,每一個父節點都有兩個子節點。二叉樹定義以下:app
struct Node { int val; Node *left; Node *right; Node *next; }
填充它的每一個 next 指針,讓這個指針指向其下一個右側節點。若是找不到下一個右側節點,則將 next 指針設置爲 NULL
。函數
初始狀態下,全部 next 指針都被設置爲 NULL
。指針
進階:code
示例:遞歸
輸入:root = [1,2,3,4,5,6,7] 輸出:[1,#,2,3,#,4,5,6,7,#] 解釋:給定二叉樹如圖 A 所示,你的函數應該填充它的每一個 next 指針,以指向其下一個右側節點,如圖 B 所示。序列化的輸出按層序遍歷排列,同一層節點由 next 指針鏈接,'#' 標誌着每一層的結束。
提示:隊列
4096
-1000 <= node.val <= 1000
Language: 所有題目leetcode
簡單來講,完美二叉樹的定義是任意一個父節點都有兩個子節點。題目的要求是填充每個節點的右側next指針,而後咱們能夠把它轉化爲求解二叉樹的層序遍歷,遍歷二叉樹每層的節點,而後把節點的next指針指向它的右側,注意初始狀態下,全部 next 指針都被設置爲 NULL
,因此不須要考慮每一層最後一個節點。get
在實現層序遍歷(BFS)的過程當中利用到了隊列的性質:先入先出,每次從隊列裏pop出來的是該節點右側的節點。it
""" # Definition for a Node. 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': # BFS if not root: return queue = [root] while queue: size = len(queue) for i in range(size): cur = queue.pop(0) if i < size - 1: # 層序遍歷的最後一個元素不考慮 cur.next = queue[0] if cur.left: queue.append(cur.left) if cur.right: queue.append(cur.right) return root