1. 程式人生 > >【LeetCode 中等題】55-填充同一層的兄弟節點

【LeetCode 中等題】55-填充同一層的兄弟節點

題目描述:給定一個二叉樹

struct TreeLinkNode {
  TreeLinkNode *left;
  TreeLinkNode *right;
  TreeLinkNode *next;
}

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

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

說明:

  • 你只能使用額外常數空間。
  • 使用遞迴解題也符合要求,本題中遞迴程式佔用的棧空間不算做額外的空間複雜度。
  • 你可以假設它是一個完美二叉樹(即所有葉子節點都在同一層,每個父節點都有兩個子節點)。

示例:

給定完美二叉樹,

     1
   /  \
  2    3
 / \  / \
4  5  6  7

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

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

解法1。類似於是DFS和BFS的結合,遍歷節點是DFS,處理節點的next指向是BFS

# 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
        if root.left:
            root.left.next = root.right
        if root.right:
            if root.next:
                root.right.next = root.next.left
        self.connect(root.left)
        self.connect(root.right)

解法2。BFS的方法,每次從最左邊開始,在該層逐個往後設定next指標。

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

                cur = cur.next
            start = start.left

參考連結:https://www.cnblogs.com/ariel-dreamland/p/9165670.html