1. 程式人生 > >[和小菜雞一起刷題(python)] LeetCode 117 填充同一層的兄弟節點 II (Populating Next Right Pointers in Each Node II)

[和小菜雞一起刷題(python)] LeetCode 117 填充同一層的兄弟節點 II (Populating Next Right Pointers in Each Node II)

LeetCode 117. 填充同一層的兄弟節點 II(Populating Next Right Pointers in Each Node II)

原題

給定一個二叉樹

struct TreeLinkNode {
TreeLinkNode *left;
TreeLinkNode *right;
TreeLinkNode *next;
}
填充它的每個 next 指標,讓這個指標指向其下一個右側節點。如果找不到下一個右側節點,則將 next 指標設定為 NULL。

初始狀態下,所有 next 指標都被設定為 NULL。

說明:

你只能使用額外常數空間。
使用遞迴解題也符合要求,本題中遞迴程式佔用的棧空間不算做額外的空間複雜度。
示例:

給定二叉樹,

 	1
   / \
  2   3
 / \   \
4  5    7

呼叫你的函式後,該二叉樹變為:

 	1 -> NULL
   / \
 2 -> 3 -> NULL
 / \   \
4->5->  7-> NULL

思路

此題是 LeetCode 116 填充同一層的兄弟節點 的改版, 不同點在於輸入的樹不再是完美二叉樹。其實思路和116題相同,把問題轉化為給定一層已經連結的節點,請連結下面一層。由於不再是完美二叉樹,首個節點需要另外記錄。因此給需要連結的層建立一個哨兵節點,依次連結該層節點。之後,遞迴傳入該層的第一個節點,即dummy.next。

程式碼

# Definition for binary tree with next pointer.
# class TreeLinkNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#         self.next = None

class Solution:
    # @param root, a tree link node
    # @return nothing
    def connect
(self, root): if not root: return cur = root dummy = p = TreeLinkNode(0) while cur: if cur.left: p.next = cur.left p = p.next if cur.right: p.next = cur.right p = p.next cur = cur.next self.connect(dummy.next)