-
Notifications
You must be signed in to change notification settings - Fork 0
104. Maximum Depth of Binary Tree #22
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,30 @@ | ||
| ## 考察 | ||
| - 過去に解いたことあり | ||
| - 方針 | ||
| - DFS | ||
| - 左部分木と右部分木のdepthのmaxを取って1を追加すれば良さそう | ||
| - 帰りがけで計算したいので再帰で書きたいところ | ||
| - 再帰の深さが最大10^4になるのが気になるが、recursionlimitが550000に設定されているので大丈夫そう | ||
| - BFS | ||
| - 深さ(レベル)別に見ていけば、最後に探索するノードの深さが答え | ||
| - Step1ではDFSで実装してみる | ||
|
|
||
| ## Step1 | ||
| - 再帰DFSで実装 | ||
| - time: O(n), space: O(n) | ||
|
|
||
| ## Step2 | ||
| - BFSでも実装 | ||
| - キューのところをスタックにすれば非再帰DFSにもなる | ||
| - time: O(n), space: O(n) | ||
| - 他の人のPRを検索 | ||
| - 行きと帰りのラベルを付けてスタックに積めば、帰りがけの計算も非再帰で表現可能 | ||
| - https://discord.com/channels/1084280443945353267/1201211204547383386/1228400327800127648 | ||
|
|
||
| ## Step3 | ||
| - 1回目: 28s | ||
| - 2回目: 28s | ||
| - 3回目: 26s | ||
|
|
||
| ## Step4 | ||
| - キューにdepthを入れないversionのBFSを追加 | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| # Definition for a binary tree node. | ||
| # class TreeNode: | ||
| # def __init__(self, val=0, left=None, right=None): | ||
| # self.val = val | ||
| # self.left = left | ||
| # self.right = right | ||
| class Solution: | ||
| def maxDepth(self, root: Optional[TreeNode]) -> int: | ||
| if not root: | ||
| return 0 | ||
| return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| # Definition for a binary tree node. | ||
| # class TreeNode: | ||
| # def __init__(self, val=0, left=None, right=None): | ||
| # self.val = val | ||
| # self.left = left | ||
| # self.right = right | ||
| class Solution: | ||
| def maxDepth(self, root: Optional[TreeNode]) -> int: | ||
| nodes_to_visit = deque([(root, 1)]) | ||
| max_depth = 0 | ||
|
|
||
| while nodes_to_visit: | ||
| node, depth = nodes_to_visit.popleft() | ||
| if not node: continue | ||
| max_depth = max(max_depth, depth) | ||
| nodes_to_visit.append((node.left, depth + 1)) | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 自分ならnode.leftがNoneのときはnodes_to_visitに入れないですかね。 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. これ、良し悪しで None が入らないとすると、root が None でないことも確認する必要がありますね。 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. たしかに、そっちもなおさないとですね。 |
||
| nodes_to_visit.append((node.right, depth + 1)) | ||
|
|
||
| return max_depth | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| # Definition for a binary tree node. | ||
| # class TreeNode: | ||
| # def __init__(self, val=0, left=None, right=None): | ||
| # self.val = val | ||
| # self.left = left | ||
| # self.right = right | ||
| class Solution: | ||
| def maxDepth(self, root: Optional[TreeNode]) -> int: | ||
| if not root: | ||
| return 0 | ||
| return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1 | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 遅くなってしまい申し訳ございませんが,確認いたしました. left_depth = self.maxDepth(root.left)
right_depth = self.maxDepth(root.right)
depth = max(left_depth, right_depth) + 1
return depth
Owner
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 左の木の深さと右の木の深さを明示して書いても見やすいですね。ありがとうございます。 |
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,24 @@ | ||
| # Definition for a binary tree node. | ||
| # class TreeNode: | ||
| # def __init__(self, val=0, left=None, right=None): | ||
| # self.val = val | ||
| # self.left = left | ||
| # self.right = right | ||
| class Solution: | ||
| def maxDepth(self, root: Optional[TreeNode]) -> int: | ||
| if not root: | ||
| return 0 | ||
|
|
||
| max_depth = 0 | ||
| nodes_to_visit = deque([root]) | ||
| while nodes_to_visit: | ||
| max_depth += 1 | ||
| level_size = len(nodes_to_visit) | ||
| for _ in range(level_size): | ||
| node = nodes_to_visit.popleft() | ||
| if node.left: | ||
| nodes_to_visit.append(node.left) | ||
| if node.right: | ||
| nodes_to_visit.append(node.right) | ||
|
|
||
| return max_depth | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ただの感想ですみませんが、この選択肢なかったので勉強になりました🙏 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 私もご指摘いただいたのですが,
Owner
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @NobukiFukui |
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
むしろ、私の感覚は逆で、「この環境では大丈夫」なコードは可能ならば避けたいです。いつ、自分の足を撃ち抜くか分からないからです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
たしかにそうですね。ちょっと感覚をアップデートします。