LeetCode-117.填充每個節點的下一個右側節點指針 II(Populating Next Right Point...)

2021-03-02 極客算法

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

給定一個二叉樹

struct Node {  int val;  Node *left;  Node *right;  Node *next;}

填充它的每個next指針,讓這個指針指向其下一個右側節點。如果找不到下一個右側節點,則將next指針設置為NULL

初始狀態下,所有next指針都被設置為NULL

進階:

你只能使用常量級額外空間。使用遞歸解題也符合要求,本題中遞歸程序佔用的棧空間不算做額外的空間複雜度。

示例:

輸入:root = [1,2,3,4,5,null,7]輸出:[1,#,2,3,#,4,5,7,#]解釋:給定二叉樹如圖 A 所示,你的函數應該填充它的每個 next 指針,以指向其下一個右側節點,如圖 B 所示。

提示:

樹中的節點數小於 6000-100 <= node.val <= 100

來源:力扣(LeetCode)

連結:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/

Link:https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/

寬度優先搜索

O(N)

使用隊列

上一題的代碼可以原封不動地放在這裡,哈哈~

from collections import dequeclass Solution:    def connect(self, root: 'Node') -> 'Node':
if root is None: return None
queue = deque([root])
while len(queue) > 0: count = len(queue)
for i in range(count): cur = queue.popleft()
if i + 1 < count: cur.next = queue[0]
if cur.left is not None: queue.append(cur.left)
if cur.right is not None: queue.append(cur.right)
return root

不使用隊列

需要一個哨兵頭節點,不然代碼寫起來太麻煩了

有了頭節點,每一排當作鍊表連結起來

結尾記得把頭節點拆掉

class Solution:    def connect(self, root: 'Node') -> 'Node':
node = root head = Node() while node is not None:
cur = head while node is not None: if node.left is not None: cur.next = node.left cur = cur.next
if node.right is not None: cur.next = node.right cur = cur.next
node = node.next
node = head.next head.next = None
return root

單詞循環代碼

class Solution:    def connect(self, root: 'Node') -> 'Node':
node = root cur = head = Node() while node is not None:
if node.left is not None: cur.next = node.left cur = cur.next
if node.right is not None: cur.next = node.right cur = cur.next
node = node.next
if node is None: cur = head node = head.next head.next = None
return root

--End--

相關焦點

  • LeetCode-116.填充每個節點的下一個右側節點指針(Populating Next Right Pointers...)
    填充每個節點的下一個右側節點指針給定一個 完美二叉樹 ,其所有葉子節點都在同一層,每個父節點都有兩個子節點。二叉樹定義如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每個 next 指針,讓這個指針指向其下一個右側節點。
  • LeetCode 117. 填充每個節點的下一個右側節點指針 II | Python
    填充每個節點的下一個右側節點指針 II題目來源:力扣(LeetCode)https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii 題目 給定一個二叉樹
  • LeetCode每日一題:填充每個節點的下一個右側節點指針
    另外代碼和題解也可以從我的github找到::https://github.com/liuzhidanhhh/LeetCodeSolution題目LeetCode117:填充每個節點的下一個右側節點指針 II連結:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii
  • 填充每個節點的下一個右側節點指針
    題目描述給定一個完美二叉樹,其所有葉子節點都在同一層,每個父節點都有兩個子節點。二叉樹定義如下:struct Node {  int val;  Node *left;  Node *right;  Node *next;}填充它的每個 next 指針,讓這個指針指向其下一個右側節點。
  • ​LeetCode刷題實戰138:複製帶隨機指針的鍊表
    今天和大家聊的問題叫做 複製帶隨機指針的鍊表,我們先來看題面:https://leetcode-cn.com/problems/copy-list-with-random-pointer/A linked list is given such that each node contains an additional random pointer which
  • LeetCode 例題精講 | 05 雙指針*鍊表問題:快慢指針
    雙指針這個名字在很多題解中都能見到,那麼,還有什麼題目可以用雙指針方法解決呢?實際上,雙指針是一個很籠統的概念。只要在解題時用到了兩個指針(鍊表指針、數組下標皆可),都可以叫做雙指針方法。根據兩個指針運動方式的不同,雙指針方法可以分成同向指針、對向指針、快慢指針等。
  • 每天一道leetcode61-旋轉鍊表
    旋轉鍊表分類:雙指針中文連結:https://leetcode-cn.com/problems/rotate-list/description/英文連結https://leetcode.com/problems/rotate-list/description/題目詳述 給定一個鍊表,旋轉鍊表,將鍊表每個節點向右移動 k 個位置,其中 k 是非負數
  • ​LeetCode刷題實戰148:排序鍊表
    ListNode* mergeSort(ListNode* head, ListNode *end) {    if (head == end) {//這段鍊表只有一個節點      return head;    }
  • 刻意練習C語言100小時後,我終於寫了一個鍊表
    鍊表由一個個節點(Node)組成,每個節點除了記錄數據以外,還需要記錄下一個節點的位置(如果是雙向鍊表,還需要記錄上一個節點的位置)struct _Node;typedef struct _Node Node;struct _Node{ int data; //記錄整型數據 Node
  • 合併兩個有序鍊表 | Leetcode題解
    題目描述將兩個升序鍊表合併為一個新的升序鍊表並返回。新鍊表是通過拼接給定的兩個鍊表的所有節點組成的。 否則,我們要判斷 l1 和 l2 哪一個鍊表的頭節點的值更小,然後遞歸地決定下一個添加到結果裡的節點。如果兩個鍊表有一個為空,遞歸結束。
  • Leetcode刷題-鍊表
    思路雙指針:定義兩個指針都指向鍊表頭,開始時先令其中一個指針右移k個單位,然後兩指針共同向右移動,直到前面的指針指向鍊表結尾,那麼後面的那個就是指向倒數第k個節點時間複雜度O(n)空間複雜度O(1)代碼
  • 面試官系列 - LeetCode鍊表知識點&題型總結
    它不需要一塊連續的內存空間,通過指針即可將一組零散的內存塊串聯起來。我們把內存塊成為鍊表的節點,為了將所有的節點串起來,每個鍊表的節點除了存儲數據之外,還需要記錄鍊表的下一個節點的地址,這個記錄下個節點地址的指針我們叫做後驅指針。搜索鍊表需要O(N)的時間複雜度,這點和數組類似,但是鍊表不能像數組一樣,通過索引的方式以O(1)的時間讀取第n個數。
  • LeetCode 328. 奇偶鍊表 | Python
    奇偶鍊表題目來源:力扣(LeetCode)https://leetcode-cn.com/problems/odd-even-linked-list/ 題目 給定一個單鍊表,把所有的奇數節點和偶數節點分別排在一起。
  • 劍指 Offer 55 - II. 平衡二叉樹 - leetcode 劍指offer系列
    二叉樹的深度 - leetcode 劍指 offer 系列的鋪墊, 這道題相信大家都可以迎刃而解一個比較容易想到的思路是: 先計算出每個節點的深度, 並將其存入節點=>深度字典中; 然後再遍歷一遍節點, 針對每個節點, 判斷它左右子節點的深度是否滿足要求, 所有節點都滿足的話才說明平衡.
  • leetcode:對撞指針系列
    leetcode-167:描述:給定一個已按照升序排列 的有序數組,找到兩個數使得它們相加之和等於目標數。
  • 二叉樹的下一個結點(劍指 Offer 題解Java版)
    );}①如果一個節點的右子樹不為空,那麼該節點的下一個節點是右子樹的最左節點;②否則,向上找第一個左連結指向的樹包含該節點的祖先節點。1.有右子樹的,它的下一個是右子樹的最左子節點。(一直沿著指向左子結點的指針找到的葉子節點即為下一個節點)2.沒有右子樹的,且如果它是它父節點的左子節點的話,它的下一個是它的父節點3.沒有右子樹的,且它是它父節店的右子節點的話,它的情況比較複雜,要沿著它父節點上去,直到找到它是它父節點的左子節點為止,那麼下一個就是這個父節點。