Pythonでリンクリストをジグザグ二分木に変換するプログラム
単一リンクリストがあるとすると、次のルールを使用してそれをバイナリツリーパスに変換する必要があります-
- リンクリストの先頭はルートです。
- 後続の各ノードは、値が小さい場合は親の左の子になり、それ以外の場合は右の子になります。
したがって、入力が[2,1,3,4,0,5]の場合、出力は
になります。
これを解決するには、次の手順に従います-
- 関数solve()を定義します。これはノードを取ります
- ノードがnullの場合、
- nullを返す
- root:=ノードの値と同じ値のツリーノードを作成します
- 次のノードがnullでない場合、
- ノードの次の値<ノードの値の場合、
- ルートの左側:=solve(ノードの次)
- それ以外の場合、
- ルートの権利:=solve(ノードの次)
- ノードの次の値<ノードの値の場合、
- ルートを返す
理解を深めるために、次の実装を見てみましょう-
例
class ListNode: def __init__(self, data, next = None): self.val = data self.next = next def make_list(elements): head = ListNode(elements[0]) for element in elements[1:]: ptr = head while ptr.next: ptr = ptr.next ptr.next = ListNode(element) return head class TreeNode: def __init__(self, data, left = None, right = None): self.data = data self.left = left self.right = right def print_tree(root): if root is not None: print_tree(root.left) print(root.data, end = ', ') print_tree(root.right) class Solution: def solve(self, node): if not node: return None root = TreeNode(node.val) if node.next: if node.next.val < node.val: root.left = self.solve(node.next) else: root.right = self.solve(node.next) return root ob = Solution() L = make_list([2,1,3,4,0,5]) print_tree(ob.solve(L))
入力
[2,1,3,4,0,5]
出力
1, 3, 0, 5, 4, 2,
-
Pythonの方向のリストを使用してバイナリツリーをトラバースするプログラム
二分木があり、「R」(右)、「L」(左)、「U」(上)で構成される文字列のリストが移動するとします。ルートから開始して、次の移動で各移動を実行することにより、ツリーをトラバースする必要があります。「R」は、右の子へのトラバースを示します。 「L」は、左の子へのトラバースを示します。 「U」は、その親へのトラバースを示します。 したがって、入力が次のような場合 [R、 R、 U、 L]の場合、出力は3になります これを解決するには、次の手順に従います- 過去:=新しいリスト 移動の移動ごとに、実行します 過去の終わりにルートを挿入 移動が「L」と同じ場合、
-
Pythonでバイナリツリーノードの兄弟値を見つけるプログラム
値kと二分探索木があると仮定します。ここでは、各ノードはリーフであるか、2つの子を含みます。値kを含むノードを見つけて、その兄弟の値を返す必要があります。 したがって、入力が次のような場合 k =4.の場合、出力は10になります。 これを解決するには、次の手順に従います- 関数util()を定義します。これはルート、k、ansを取ります ルートの左側がnullでなく、ルートの右側がnullでない場合、 戻る ルートの値の場合、 ルートの権利の値がkと同じである場合、 ansの最後にルートの左側の値を挿入します 戻る それ以外の場