二分探索木の勉強中です。
整数1からnの値を、各ノードの値とする二分探索木をリストで全て書き出すと言う問題で行き詰まりました。
理解できないのは以下のコードの一番最後の部分#####です。
Pyhton
1from __future__ import annotations 2from typing import List, Optional 3 4# Definition for a binary tree node. 5class TreeNode: 6 def __init__(self, val=0, left=None, right=None): 7 self.val = val 8 self.left = left 9 self.right = right 10 11class Solution: 12 def generateTrees(self, n: int) -> List[Optional[TreeNode]]: 13 if n == 0: 14 return [] 15 return self.generate(1, n) 16 17 def generate(self, start, end): 18 if start > end: 19 return [None] 20 21 all_trees = [] 22 # cnt = 0 23 for currentRootVal in range(start, end + 1): 24 all_left_subtrees = self.generate(start, currentRootVal - 1) 25 all_right_subtrees = self.generate(currentRootVal + 1, end) 26 for left_subtree in all_left_subtrees: 27 for right_subtree in all_right_subtrees: 28 currentRoot = TreeNode(currentRootVal) 29 currentRoot.left = left_subtree 30 currentRoot.right = right_subtree 31 32 all_trees.append(currentRoot) ##### 33 # cnt += 1 34 # print(f"{cnt=}") 35 return all_trees 36 37if __name__ == "__main__": 38 sol = Solution() 39 f = sol.generateTrees(3)
他の部分の再帰の形は理解できましたが、二分木の全体のリストall_treesを作っている部分がわかりません。
二重ループで再帰的に二分木を作っている過程で毎回all_treesにappendしていますが、
このコードが再帰的に実行されることで、なぜうまく全ての木を網羅できるのでしょう。
再帰的に実行されることで、その過程で作られる未完成の木もappendされてしまうような気がしてなりません。
コメントアウトしていますが、cntという変数でappendの回数を数えましたが、例えばn=3の時は正しく5回と表示されます。
しかし、print(cnt)は15回実行され、cnt=1は9回表示されます。
再帰の理解不足ということはわかりますが、そこから理解が進まなくなりました。
参考までにn=3のときに返されるall_treesは、
Pyton
1[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
です。
説明が不十分かもしれませんが、よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。