LeetCode 111
質問する
Approach 1. DFS recursively class Solution:
def minDepth(self, root: TreeNode) -> int:
if not root: [1]
return 0
if not root.left and not root.right: [2]
return 1
if not root.left: [3]
return self.minDepth(root.right) + 1
if not root.right: [4]
return self.minDepth(root.left) + 1
return min(self.minDepth(root.right),\
self.minDepth(root.left)) + 1 [5]
上の方法は私が最初に解読した方法です.DFSは反復式と再帰式の2種類に分けられる.反復解はBFSを適用する方法と似ているが,書き込みキューの代わりにスタックを用いる点がある.
そこで再帰コードを書いてみました.
[1]再帰またはbasecaseが必要です.最初のbasecaseは最上位ノードrootがNoneです.0を返します.
[2]2番目のbasecaseはルートの両側がNoneの場合である.では根だけの木なので奥行きは1.は、1を返します.
[3]今から再帰します.rootの左側がNoneで、rootの右側がNoneでない場合はminDepthを呼び出します.
minDepthが返す深さの値に1を加算します.
1を追加しない場合は、前のノードの深さのみが計算されるため、値を更新するには1を追加する必要があります.
[4]ルートの右側がNoneで、ルートの左側がNoneでない場合、minDepthが呼び出され、minDepthが返す深度値に1が加算される.
[5]根の左右の2つがある場合、この2つのうち1つの値が小さいものを選択し、もう1つ追加する.
例の入力として、適切な場所にルートディレクトリを入力します.valとconditionが印刷されました.
input: [3,9,20,null,null,15,7]
stdout:=======================================
root is 3
root has both children
=======================================
root is 20
root has both children
=======================================
root is 7
root has no children
=======================================
root is 15
root has no children
=======================================
root is 9
root has no children
予想される順序で3,20,7,15,9を順に探索することが見られる.まず最下端7に到達する.
Approach 2. BFS class Solution:
def minDepth(self, root:TreeNode) -> int:
if not root: [3]
return 0
q = collections.deque() [1]
q.append((root,1)) [2]
while q: [4]
node, depth = q.popleft() [5]
if not node.left and not node.right: [6]
return depth
if node.left: [7]
q.append((node.left, depth+1))
if node.right: [8]
q.append((node.right, depth+1))
[1]ツリーを保存するためにcollectionというモジュールからdequeを取得する.
[2]ツリーと奥行き1を最初に保存します.根が1つあれば、深さは1になるからです.ルートがNoneの場合、最初の行[3]で保留して0を返します.
[4]qが空でないまでwhile loopを回します.
[5]まずpopleftによりqに格納されたノードと深さを取得する.
[6]ノードの左、右がNone(つまりノードが木の最下部)であれば、深さを返す
[7]ノードの左側のみ(右側がNone)の場合、ノードの左側のサブツリーはqに保存され、深さは+1となり、ハッシュ値によって更新される
[8][7]と同様に,ノードの右側のみであれば右側サブツリーを保存し,深さ+1に更新する.
[6]時にwhile loopから値を返す!
例の入力として、適切な場所にルートディレクトリを入力します.valとconditionが印刷されました.
input: [3,9,20,null,null,15,7]
stdout:=================================
node is 3
depth: 1
=================================
node has left child
=================================
node has right child
=================================
node is 9
depth: 2
=================================
node has no children
比較
次はDFS、上はBFS解読の結果です.
DFSは、必要な時間とメモリから、より長い時間が必要であることがわかります.なぜなら、この問題は最大深さではなく、最小深さを求めるからだ.ターゲットは存在しないサブノードを探し,ルートからノードへの深さを求めるため,隣接ノードからのナビゲーションがより速くなる.一番下のノードまで行く理由がないからです.
Reference
この問題について(LeetCode 111), 我々は、より多くの情報をここで見つけました
https://velog.io/@hojin11choi/TIL-LeetCode-111
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
class Solution:
def minDepth(self, root: TreeNode) -> int:
if not root: [1]
return 0
if not root.left and not root.right: [2]
return 1
if not root.left: [3]
return self.minDepth(root.right) + 1
if not root.right: [4]
return self.minDepth(root.left) + 1
return min(self.minDepth(root.right),\
self.minDepth(root.left)) + 1 [5]
上の方法は私が最初に解読した方法です.DFSは反復式と再帰式の2種類に分けられる.反復解はBFSを適用する方法と似ているが,書き込みキューの代わりにスタックを用いる点がある.そこで再帰コードを書いてみました.
[1]再帰またはbasecaseが必要です.最初のbasecaseは最上位ノードrootがNoneです.0を返します.
[2]2番目のbasecaseはルートの両側がNoneの場合である.では根だけの木なので奥行きは1.は、1を返します.
[3]今から再帰します.rootの左側がNoneで、rootの右側がNoneでない場合はminDepthを呼び出します.
minDepthが返す深さの値に1を加算します.
1を追加しない場合は、前のノードの深さのみが計算されるため、値を更新するには1を追加する必要があります.
[4]ルートの右側がNoneで、ルートの左側がNoneでない場合、minDepthが呼び出され、minDepthが返す深度値に1が加算される.
[5]根の左右の2つがある場合、この2つのうち1つの値が小さいものを選択し、もう1つ追加する.
例の入力として、適切な場所にルートディレクトリを入力します.valとconditionが印刷されました.
input: [3,9,20,null,null,15,7]
stdout:
=======================================
root is 3
root has both children
=======================================
root is 20
root has both children
=======================================
root is 7
root has no children
=======================================
root is 15
root has no children
=======================================
root is 9
root has no children
予想される順序で3,20,7,15,9を順に探索することが見られる.まず最下端7に到達する.Approach 2. BFS class Solution:
def minDepth(self, root:TreeNode) -> int:
if not root: [3]
return 0
q = collections.deque() [1]
q.append((root,1)) [2]
while q: [4]
node, depth = q.popleft() [5]
if not node.left and not node.right: [6]
return depth
if node.left: [7]
q.append((node.left, depth+1))
if node.right: [8]
q.append((node.right, depth+1))
[1]ツリーを保存するためにcollectionというモジュールからdequeを取得する.
[2]ツリーと奥行き1を最初に保存します.根が1つあれば、深さは1になるからです.ルートがNoneの場合、最初の行[3]で保留して0を返します.
[4]qが空でないまでwhile loopを回します.
[5]まずpopleftによりqに格納されたノードと深さを取得する.
[6]ノードの左、右がNone(つまりノードが木の最下部)であれば、深さを返す
[7]ノードの左側のみ(右側がNone)の場合、ノードの左側のサブツリーはqに保存され、深さは+1となり、ハッシュ値によって更新される
[8][7]と同様に,ノードの右側のみであれば右側サブツリーを保存し,深さ+1に更新する.
[6]時にwhile loopから値を返す!
例の入力として、適切な場所にルートディレクトリを入力します.valとconditionが印刷されました.
input: [3,9,20,null,null,15,7]
stdout:=================================
node is 3
depth: 1
=================================
node has left child
=================================
node has right child
=================================
node is 9
depth: 2
=================================
node has no children
比較
次はDFS、上はBFS解読の結果です.
DFSは、必要な時間とメモリから、より長い時間が必要であることがわかります.なぜなら、この問題は最大深さではなく、最小深さを求めるからだ.ターゲットは存在しないサブノードを探し,ルートからノードへの深さを求めるため,隣接ノードからのナビゲーションがより速くなる.一番下のノードまで行く理由がないからです.
Reference
この問題について(LeetCode 111), 我々は、より多くの情報をここで見つけました
https://velog.io/@hojin11choi/TIL-LeetCode-111
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
class Solution:
def minDepth(self, root:TreeNode) -> int:
if not root: [3]
return 0
q = collections.deque() [1]
q.append((root,1)) [2]
while q: [4]
node, depth = q.popleft() [5]
if not node.left and not node.right: [6]
return depth
if node.left: [7]
q.append((node.left, depth+1))
if node.right: [8]
q.append((node.right, depth+1))
=================================
node is 3
depth: 1
=================================
node has left child
=================================
node has right child
=================================
node is 9
depth: 2
=================================
node has no children
次はDFS、上はBFS解読の結果です.
DFSは、必要な時間とメモリから、より長い時間が必要であることがわかります.なぜなら、この問題は最大深さではなく、最小深さを求めるからだ.ターゲットは存在しないサブノードを探し,ルートからノードへの深さを求めるため,隣接ノードからのナビゲーションがより速くなる.一番下のノードまで行く理由がないからです.
Reference
この問題について(LeetCode 111), 我々は、より多くの情報をここで見つけました https://velog.io/@hojin11choi/TIL-LeetCode-111テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol