105 construct binary tree from preorder and inorder traversal - #29
105 construct binary tree from preorder and inorder traversal#29tarinaihitori wants to merge 3 commits into
Conversation
| preorder_index = 0 | ||
|
|
||
| def build_tree_helper(left, right): | ||
| nonlocal preorder_index |
There was a problem hiding this comment.
| ```python | ||
| class Solution: | ||
| def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]: | ||
| value_to_inorder_index = {value:index for index, value in enumerate(inorder)} |
There was a problem hiding this comment.
この程度の内包表記であればすんなり読めると思います。
コロンの後は空白を入れた方がいいと思います。
| <https://github.com/Fuminiton/LeetCode/pull/29> | ||
|
|
||
| Python勢のコードを読んでいて思ったのだが、 | ||
| inorderの値とインデックスのマップを作るときに、私は内包表記で一行で書きたくなるが、 |
There was a problem hiding this comment.
横長になることを避けてあまり使わないイメージがあります。m*nのgridを作るくらいなら内包表記使いたくなる気がするので。
| return root | ||
|
|
||
| return build_tree_helper(0, len(inorder)) | ||
|
|
There was a problem hiding this comment.
いいと思います。
ループへの書き換えもやっておくと、BSTの走査順に関する理解が深まると思うので、やってもいいと思います。
| ``` | ||
|
|
||
| inorderでの頭からの構築 | ||
| まだ右子が確定していないノードをスタックに積むことで、順序情報(preorderのインデックス順)に基づいた構築をしている? |
There was a problem hiding this comment.
inorder の順にノードが箱から出てくるとします。
あるノード node が出てきたとします。node.left はいるならばもうでているけれども、どこかに宙ぶらりんのはずです。node.right はまだ出てきていません。
node.left.right はいるとしたら、もう出ています。しかし、node.left が出た後に出ていて、いま、node が出るまでは、どこにつくか分からなかったはずです。
どうしてくっつくかが分かったかというと、node の inorder_index ですね。これよりも前のやつは全部回収しないといけないんですよ。
そうすると、もう一つ容器が必要な事が分かります。籠とでも呼びましょう。籠には「left は埋まったが right がまだなノード」がすべて入っています。そして、さっきの node が出てくると、.left の下にあるもの、つまり、preorder で後ろになるものを籠からすべて取り出し、鎖状にしてぶら下げます。
There was a problem hiding this comment.
鎖状にぶら下げる方法は、preorder で後ろになる順から .right で繋いでいきます。で、全体を node.left につなぎます。
これを扱いやすい構造は stack です。
あとは、最後、箱が空になったときには、籠の中にいろいろはいっているものを追い出す必要があります。
これは、番兵を使って preorder の場所が -1 よりも大きいものを出してくるとすれば、すべてが飛び出してくるはずです。
| value_to_inorder_index = {value:index for index, value in enumerate(inorder)} | ||
| preorder_index = 0 | ||
|
|
||
| def build_subtree(left, right): |
There was a problem hiding this comment.
left, right が何を指すのかがわかるような関数名にしたい気がします。
https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/