104. Maximum Depth of Binary Tree#20
Conversation
| # 見積もり | ||
| - 入力サイズ: 0 <= ノード数 <= 10^4 | ||
| - 時間計算量: O(N)(全ノードをちょうど1回ずつ処理) | ||
| - 実行時間の見積もり: 10^4 / 10^8 = 10^-4 s = 0.1ms |
There was a problem hiding this comment.
たしかに.
何度も書いてますが,書かなくても自明と思っているのは自分だけですね.
ありがとうございます
| return max(countDepth(node.Left), countDepth(node.Right)) + 1 | ||
| } | ||
| ``` | ||
| - 短くはなったが,まだ自然には感じられない |
There was a problem hiding this comment.
https://docs.google.com/document/d/11HV35ADPo9QxJOpJQ24FcZvtvioli770WWdZZDaLOfg/edit?tab=t.0
再帰は、この辺りを見るとよいと思います。
それはそれとして、言語化してみるとこんな感じです。
・木構造の各ノードには人が立っており、ルートがボス、その下に部下、さらにその下に部下の部下、、、と続きます。この解答では、末端は葉ノードではなく、葉のさらに下にぶら下がっている nil です(nilがぶら下がっているいうのはあくまでイメージです)。
- nilは上司に「深さ0です」と報告。
- 葉は上司に「深さ1です」と報告。
- それ以外は、左右両方の部下に「最大深さを調べて」と依頼。返ってきた値を比べ、 深い方に1を足して上司に報告。
というイメージです。
There was a problem hiding this comment.
この解答では、で末端は葉ノードではなく、葉のさらに下にいる nil です。
一方で最初の解答は、末端は葉ノードな感じがしました。
- 葉は上司に「深さ1です」と報告。
- それ以外は、左右両方の部下がnilでないときは「最大深さを調べて」と依頼。返ってきた値を比べ、 深い方に1を足して上司に報告。
というイメージです
そう考えたとき、最初のコードにおけるnilの条件分岐は何かというと、これはroot=nilに対する処理ですね。ですので、最初のコードは以下のように書くほうが自然な気がします。
func maxDepth(root *TreeNode) int {
if root == nil {
return 0
}
maxDepth := 0
maxDepth = countDepth(root)
return maxDepth
}
func countDepth(node *TreeNode) int {
if node.Left == nil && node.Right == nil {
return 1
}
leftDepth := 0
rightDepth := 0
if node.Left != nil {
leftDepth = countDepth(node.Left)
}
if node.Right != nil {
rightDepth = countDepth(node.Right)
}
return max(leftDepth, rightDepth) + 1
}There was a problem hiding this comment.
なるほど,root以外は,すでにnilチェックを呼び出し前に行っているのでたしかにそれも通りますね.
このへんが統一されていないのは,たしかに明確にイメージがついてなかったから,かもしれません.
| } | ||
|
|
||
| return max(maxDepth(node.Left), maxDepth(node.Right)) + 1 | ||
| } |
There was a problem hiding this comment.
node, node.Left, node.Rightはそれぞれ、root, root.Left, root.Rightですね。
There was a problem hiding this comment.
ああ,これは動作したコードをちゃんとコピペせず,適当に再現してしまったためですね.
大変失礼しました.
https://leetcode.com/problems/maximum-depth-of-binary-tree