![見出し画像](https://assets.st-note.com/production/uploads/images/126800096/rectangle_large_type_2_eae81005d2373167ffd3b6a8731d3c5d.png?width=1200)
バイナリツリー_プリオーダー走査 (Preorder Traversal)の実装 #441
今回はデータ構造の一種であるバイナリツリーにおいて、データを「プリオーダー走査」(Pre-order Traversal)する方法についてです。
バイナリツリー自体の概要は以下にまとめました。
ちなみに走査とは先頭から順にデータを見ていくことを指し、バイナリツリーを走査するアルゴリズムは主に4つあります。
Pre-order Traversal
In-order Traversal
Post-order Traversal
Level-order Traversal
このうちのPre-order Traversalについてです。
プリオーダー走査とは
プリオーダー走査は次の順序で各ノードを訪問します。
ルート訪問: 最初に、ツリーのルートノードを訪問します。
左サブツリーの走査: 次に、ルートの左側にあるサブツリーをプリオーダー走査の順序で巡ります。
右サブツリーの走査: 左サブツリーの走査が完了したら、右側にあるサブツリーを同じくプリオーダー走査で巡ります。
このプロセスは、各サブツリーに対して再帰的に繰り返されます。
具体的なコード例
Pythonでプリオーダー走査をするコードを書いてみました。
渡していく左や右の値 (root) がNoneになるまで、再帰的な処理が続くようにしています。
# 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 preorderTraversal(self, root: Optional[TreeNode], result=None) -> List[int]:
if result is None:
result = []
if root is None:
return result
result.append(root.val)
result = self.preorderTraversal(root.left, result)
result = self.preorderTraversal(root.right, result)
return result
もっといい書き方がある気がしますがとりあえず。
ここまでお読みいただきありがとうございました!