今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

Algorithem_各ノードに次の右側のポインタを埋める

アルゴリズム_各ノードに次の右側のポインタを埋める#

すべての葉が同じレベルにある完全二分木が与えられます。また、すべての親ノードは 2 つの子を持ちます。この二分木は次の定義を持っています:

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

各 next ポインタを次の右側のノードを指すように埋めてください。次の右側のノードが存在しない場合、next ポインタは NULL に設定されます。

最初は、すべての next ポインタが NULL に設定されています。

例 1:

Input: root = [1,2,3,4,5,6,7]
Output: [1,#,2,3,#,4,5,6,7,#]

説明:上記の完全二分木(図 A)が与えられた場合、関数は各 next ポインタを次の右側のノードに指すように埋める必要があります。シリアル化された出力は、next ポインタによって接続されたレベル順のものであり、'#' は各レベルの終わりを示しています。

例 2:

Input: root = []
Output: []

解法#

この問題はわかりませんが、解法を見ても理解できなかったので、ビデオを探しました。POPULATING NEXT RIGHT POINTERS IN EACH NODE (Leetcode) - Code & Whiteboardというビデオを見つけました。ビデオでは Python のコードが説明されていますが、ロジックは非常に明確で、Swift に翻訳することもできます。

簡単に理解すると:

  • 完全二分木なので、left が存在する場合は必ず right も存在するため、ノードを走査する際に node.left の存在を確認するだけで次のレベルがあるかどうかがわかります。
  • すべての next ポインタは NULL に設定されていますので、初期状態ではすべての node の next は nil です。
  • 同じ親ノードの left と right の間に next の関係を設定します。つまり、node.left.next = node.right となります。例えば、2 と 3、4 と 5、6 と 7 の間です。
  • 異なる親ノードの間の next の関係を設定するには、親ノードの next が存在するかどうかを確認する必要があります。存在する場合、node.right.next = node.next.left となります。例えば、5 と 6 の間です。

以下はコードです:


/**
 * Definition for a Node.
 * public class Node {
 *     public var val: Int
 *     public var left: Node?
 *     public var right: Node?
 *	   public var next: Node?
 *     public init(_ val: Int) {
 *         self.val = val
 *         self.left = nil
 *         self.right = nil
 *         self.next = nil
 *     }
 * }
 */

class Solution {
    func connect(_ root: Node?) -> Node? {
        // エラーチェック
        if root == nil {
            return nil
        }
        
        var leftMostNode = root
        // leftをループする
        while (leftMostNode?.left != nil) {
            var cur = leftMostNode
            while (cur?.left != nil) {
                cur?.left?.next = cur?.right
                if (cur?.next != nil) {
                    cur?.right?.next = cur?.next?.left
                }
                cur = cur?.next
            }
            leftMostNode = leftMostNode?.left
        }
        return root
    }
}

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。