Skip to content

102. Binary Tree Level Order Traversal - #25

Open
miyataka wants to merge 2 commits into
mainfrom
102_BinaryTreeLevelOrderTraversal
Open

102. Binary Tree Level Order Traversal#25
miyataka wants to merge 2 commits into
mainfrom
102_BinaryTreeLevelOrderTraversal

Conversation

@miyataka

Copy link
Copy Markdown
Owner

@miyataka
miyataka force-pushed the 102_BinaryTreeLevelOrderTraversal branch from 95fe28d to 1d606ef Compare July 12, 2026 13:18
- 他の人のPRをみる
- https://github.com/chryschron/codings/pull/25
- DFSも解いている.えらい
- iterativeのDFSで,queueにright, leftの順でpushするのが,ちょっとアレと思ったけど,コードは正しかった

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

iterativeなコードはrecursiveで暗黙に行われている関数呼び出し時のstack使用を明示するだけなので、recursive == while+stackが成り立ちます(一応queueでstackをエミュレートすることも可能です)。

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ですね.コメントありがとうございます.

このへん自分の理解では,BFS・DFSという軸と,recursive / iterativeという軸があり,それぞれ相互に書き換え可能,という理解でした.「iterativeなコードはrecursiveで暗黙に行われている関数呼び出し時のstack使用を明示するだけ」のような説明ができるようにしておくべきだなと気づけました.

(個人的な感覚ですがBFSならiterativeに,DFSならrecursiveというのが直感的で,ただしスタックオーバーフローを懸念して,DFSもiterativeに書き直す,ということをオンラインコーディング練習会で何度かやりました.)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DFSならrecursiveでBFSならiterativeが直感的というよりかは、有限二分木DFSならrecursive/stackだけ(PDA)で解けるがBFSは理論上不可能(PDAよりも強い、追加の線形データ領域を持つ計算機が必要)という認識が正しいです。たとえ二分木BFSをrecursiveに書いたとしても、queue等別の記憶領域を作ってやらないといけません。

@h-masder h-masder Jul 14, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@chryschron さん
コメントの意図を書くと良いと思います。

例えば、

二分木BFSをrecursiveに書いたとしても、queue等別の記憶領域を作ってやる必要がある

という点について、この知識を使うことでコードの改善にどうつながるのか、などです。

また、miyataka さんのコメントは、前後の文脈から見ると、コードの可読性についての話をされているように見えました。もしかみ合っていなかったとして、そういった認識のずれをなくすためにも、コメントの意図を書くとよいと思いました。

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@chryschron

DFSならrecursiveでBFSならiterativeが直感的というよりかは、有限二分木DFSならrecursive/stackだけ(PDA)で解けるがBFSは理論上不可能(PDAよりも強い、追加の線形データ領域を持つ計算機が必要)という認識が正しいです。たとえ二分木BFSをrecursiveに書いたとしても、queue等別の記憶領域を作ってやらないといけません。

はい,それはその通りですね.
ちなみに一度目の自分からのコメントの,「(個人的な感覚ですが〜」のくだりは,あくまで自分の好みの話であるので,正しい正しくないの話ではない,と思ってもいます.

@h-masder さんからもコメントしていただいてますが, @chryschron さんのコメントの意図がつかめておらず,一連のやりとりにおいて,自分は変な応答をしてしまっているかもしれません.

どこですれ違ったかわかっていないので,そもそもコメントいただいた,solution.mdのL97-L100あたりの記述について,このとき考えていただろうことを書き下してみます.


  1. PRをみる.ざっとみてstep1はBFSだなと読み取る.
  2. step1をもうちょいみる.これは自分とほぼ同じ回答だなと思う.
  3. step1のコードの下の日本語を読む.DFSを書くんだなと思う.
  4. solution.mdに「DFSも解いている.えらい」と書く
  5. step2の最初のほうのコードを読む.再帰だなぁと思う.
  6. 次のコードブロックを読む(このときにコードブロックの手前(L68)のiterativeは読み飛ばしている)
  7. 再帰とは全体の形が違うので,step3はBFSで書いたのかな?となんとなく思う(これは勘違い)
  8. pushがright,leftの順だ!なぜ?と思う.
  9. solution.mdに「iterativeのDFSで,queueにright, leftの順でpushするのが,ちょっとアレと思ったけど,コードは正しかった」と書く.(なお,ここで「iterativeのDFSで」と書いているものの,自分の文章の矛盾には気づいていない.)
  10. よく読んだら,自分がBFSだと思っていたものはDFSで,自分がqueueだと思っていたものはstackだったと気づく
  11. solution.mdに「よく読んだらstackという命名にちゃんとなっていた」と書く.(このコメントも不正確で,stackは命名ではなくクラスですね)

こう書くと,自分も大概なメモを書いてしまって(そしてそのままにして)いるなぁと思いました.

返信はなくても大丈夫です(労力に見合わないと思うので).もし読んでもらったらemojiリアクションだけもらえるとありがたいです

@chryschron chryschron Jul 15, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

いえ、私もようやく全容を把握しました。
私のコメント意図は最初から一貫していて、 @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{}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

好みの問題ですが、同じ深さであることを示すsameを付けてsameLayerValuessameDepthValuesとしてもいいと思います。

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ありがとうございます.たしかにわかりやすくなりそうです

- iterativeのDFSで,queueにright, leftの順でpushするのが,ちょっとアレと思ったけど,コードは正しかった
- よく読んだらstackという命名にちゃんとなっていた
- https://github.com/skypenguins/coding-practice/pull/40
- level_by_level, あまり意図わからんかった.でも修正されてた

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

やっぱり level_by_level は分かりづらいですよね…

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants