102. Binary Tree Level Order Traversal - #25
Conversation
95fe28d to
1d606ef
Compare
| - 他の人のPRをみる | ||
| - https://github.com/chryschron/codings/pull/25 | ||
| - DFSも解いている.えらい | ||
| - iterativeのDFSで,queueにright, leftの順でpushするのが,ちょっとアレと思ったけど,コードは正しかった |
There was a problem hiding this comment.
iterativeなコードはrecursiveで暗黙に行われている関数呼び出し時のstack使用を明示するだけなので、recursive == while+stackが成り立ちます(一応queueでstackをエミュレートすることも可能です)。
There was a problem hiding this comment.
ですね.コメントありがとうございます.
このへん自分の理解では,BFS・DFSという軸と,recursive / iterativeという軸があり,それぞれ相互に書き換え可能,という理解でした.「iterativeなコードはrecursiveで暗黙に行われている関数呼び出し時のstack使用を明示するだけ」のような説明ができるようにしておくべきだなと気づけました.
(個人的な感覚ですがBFSならiterativeに,DFSならrecursiveというのが直感的で,ただしスタックオーバーフローを懸念して,DFSもiterativeに書き直す,ということをオンラインコーディング練習会で何度かやりました.)
There was a problem hiding this comment.
DFSならrecursiveでBFSならiterativeが直感的というよりかは、有限二分木DFSならrecursive/stackだけ(PDA)で解けるがBFSは理論上不可能(PDAよりも強い、追加の線形データ領域を持つ計算機が必要)という認識が正しいです。たとえ二分木BFSをrecursiveに書いたとしても、queue等別の記憶領域を作ってやらないといけません。
There was a problem hiding this comment.
@chryschron さん
コメントの意図を書くと良いと思います。
例えば、
二分木BFSをrecursiveに書いたとしても、queue等別の記憶領域を作ってやる必要がある
という点について、この知識を使うことでコードの改善にどうつながるのか、などです。
また、miyataka さんのコメントは、前後の文脈から見ると、コードの可読性についての話をされているように見えました。もしかみ合っていなかったとして、そういった認識のずれをなくすためにも、コメントの意図を書くとよいと思いました。
There was a problem hiding this comment.
DFSならrecursiveでBFSならiterativeが直感的というよりかは、有限二分木DFSならrecursive/stackだけ(PDA)で解けるがBFSは理論上不可能(PDAよりも強い、追加の線形データ領域を持つ計算機が必要)という認識が正しいです。たとえ二分木BFSをrecursiveに書いたとしても、queue等別の記憶領域を作ってやらないといけません。
はい,それはその通りですね.
ちなみに一度目の自分からのコメントの,「(個人的な感覚ですが〜」のくだりは,あくまで自分の好みの話であるので,正しい正しくないの話ではない,と思ってもいます.
@h-masder さんからもコメントしていただいてますが, @chryschron さんのコメントの意図がつかめておらず,一連のやりとりにおいて,自分は変な応答をしてしまっているかもしれません.
どこですれ違ったかわかっていないので,そもそもコメントいただいた,solution.mdのL97-L100あたりの記述について,このとき考えていただろうことを書き下してみます.
- PRをみる.ざっとみてstep1はBFSだなと読み取る.
- step1をもうちょいみる.これは自分とほぼ同じ回答だなと思う.
- step1のコードの下の日本語を読む.DFSを書くんだなと思う.
- solution.mdに「DFSも解いている.えらい」と書く
- step2の最初のほうのコードを読む.再帰だなぁと思う.
- 次のコードブロックを読む(このときにコードブロックの手前(L68)の
iterativeは読み飛ばしている) - 再帰とは全体の形が違うので,step3はBFSで書いたのかな?となんとなく思う(これは勘違い)
- pushがright,leftの順だ!なぜ?と思う.
- solution.mdに「iterativeのDFSで,queueにright, leftの順でpushするのが,ちょっとアレと思ったけど,コードは正しかった」と書く.(なお,ここで「iterativeのDFSで」と書いているものの,自分の文章の矛盾には気づいていない.)
- よく読んだら,自分がBFSだと思っていたものはDFSで,自分がqueueだと思っていたものはstackだったと気づく
- solution.mdに「よく読んだらstackという命名にちゃんとなっていた」と書く.(このコメントも不正確で,stackは命名ではなくクラスですね)
こう書くと,自分も大概なメモを書いてしまって(そしてそのままにして)いるなぁと思いました.
返信はなくても大丈夫です(労力に見合わないと思うので).もし読んでもらったらemojiリアクションだけもらえるとありがたいです
There was a problem hiding this comment.
いえ、私もようやく全容を把握しました。
私のコメント意図は最初から一貫していて、 @miyataka さんが最初のプルリクで私のコードに対し『iterativeのDFSで,queueにright, leftの順でpushするのが(略)』『よく読んだらstackという命名にちゃんとなっていた』と仰っており、もしかしてDFSを解くのにwhile+queueを使うと考えている、すなわち二分木DFS=PDA(それゆえwhile+stack or recursiveを直感する)という理論理解に不足があるのではないかと考えたためです。(返信を拝見する限り、釈迦に説法だったようですが)
単にBFSと混同なさっていただけのようですね。失礼いたしました。
@h-masder さん 了解しました。
|
|
||
| for len(frontier) > 0 { | ||
| nextLayer := []*TreeNode{} | ||
| layerValues := []int{} |
There was a problem hiding this comment.
好みの問題ですが、同じ深さであることを示すsameを付けてsameLayerValuesやsameDepthValuesとしてもいいと思います。
There was a problem hiding this comment.
ありがとうございます.たしかにわかりやすくなりそうです
| - iterativeのDFSで,queueにright, leftの順でpushするのが,ちょっとアレと思ったけど,コードは正しかった | ||
| - よく読んだらstackという命名にちゃんとなっていた | ||
| - https://github.com/skypenguins/coding-practice/pull/40 | ||
| - level_by_level, あまり意図わからんかった.でも修正されてた |
https://leetcode.com/problems/binary-tree-level-order-traversal/