[leetcode]Populating Next Right Pointers in Each Node @ Python [邏輯動力學]
題意:
1
/ \
2 3
/ \ / \
4 5 6 7
變為:
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ / \
4->5->6->7 -> NULL
解題思路:這道題目充分展現了宏觀和微觀完美的在細節出水乳交融的具體過程.
1) 看到二叉樹我們就想到需要使用遞歸的思路了。
2) 注意遞歸之外的細節:正式這些細節完成了實際的邏輯求解
我們以2號結點為例:為了繁衍next結點,僅需要處理兩種微觀情況:
case 1: 2 -> 3 :
Solution: root.left.next = root.right
case 2: 2 -> 5 -> 6:
Solution: root.right.next = root.next.left if root.next else None
2 -> 3
/ \ /
4->5->6
Solution 1: 這個方法是因為我無法記住網絡上提供(比如下面的solution 2)的答案,然後就按照遞歸需要解決的基本問題 (也就是上面case 1 和 2),分別解決後,拼湊出來的解法。萬歲!
結果我這個解法相當自然。
復制代碼
class Solution:
# @param root, a tree node
# @return nothing
def connect(self, root):
def recursion(root):
if root is None: return
if root.left and root.right: root.left.next = root.right;
if root.right and root.next: root.right.next = root.next.left
recursion(root.left)
recursion(root.right)
recursion(root)
復制代碼
Solution 2:
復制代碼
# Definition for a binary tree node
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# self.next = None
class Solution:
# @param root, a tree node
# @return nothing
def connect(self, root):
if root and root.left:
root.left.next = root.right
root.right.next = root.next.left if root.next else None
self.connect(root.left)
self.connect(root.right)