یک الگوریتم برای پیاده‌سازی یک درخت جستجوی دودویی بنویسید.
۱. یک کلاس `Node` تعریف کنید که یک گره در درخت را نمایش می‌دهد، با ویژگی‌های `left`، `right` و `value` برای ذخیره فرزندان و مقدار گره.

```python
class Node:
    def __init__(self, data):
        self.left = None
        self.right = None
        self.value = data
```

۲. یک کلاس `BinarySearchTree` تعریف کنید که شامل گره ریشه درخت و متدهایی برای درج یک گره، جستجوی یک گره و پیمایش درخت باشد.

```python
class BinarySearchTree:
    def __init__(self):
        self.root = None
```

۳. متد `insert` را پیاده‌سازی کنید با شروع از گره ریشه و تکرار به پایین درخت با مقایسه مقدار جدید با گره فعلی و حرکت به چپ (اگر مقدار جدید کوچکتر است) یا راست (اگر مقدار جدید بزرگتر است) تا یک مکان خالی پیدا شود. سپس گره جدید را در مکان خالی درج کنید.

```python
    def insert(self, data):
        new_node = Node(data)
        if self.root is None:
            self.root = new_node
            return
        current_node = self.root
        while current_node:
            if data < current_node.value:
                if current_node.left is None:
                    current_node.left = new_node
                    return
                else:
                    current_node = current_node.left
            else:
                if current_node.right is None:
                    current_node.right = new_node
                    return
                else:
                    current_node = current_node.right
```

۴. متد `search` را پیاده‌سازی کنید که یک مقدار را به عنوان input می‌گیرد و `True` را اگر مقدار در درخت باشد و `False` را در غیر این صورت برمی‌گرداند. مشابه متد `insert`، این متد از گره ریشه شروع می‌شود و به پایین درخت تکرار می‌کند با مقایسه مقدار جستجو با گره فعلی و حرکت به چپ یا راست تا مقدار پیدا شود یا به انتهای درخت برسد.

```python
    def search(self, data):
        current_node = self.root
        while current_node:
            if data == current_node.value:
                return True
            elif data < current_node.value:
                current_node = current_node.left
            else:
                current_node = current_node.right
        return False
```

۵. متدهای پیمایش مانند `inorder`، `preorder` و `postorder` را پیاده‌سازی کنید که گره‌ها را به ترتیب خاصی بازدید می‌کنند.