LeetCode 116. 填充每一個節點的下一個右側節點指針

116. 填充每一個節點的下一個右側節點指針

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

Solution

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
相關文章
相關標籤/搜索