درخت دودویی (Binary Tree)
درخت دودویی و پیمایشهای سهگانه: preorder، inorder و postorder با پیادهسازی بازگشتی و کاربرد هرکدام
درخت دودویی چیست؟
درخت دودویی (Binary Tree) درختی است که هر گره حداکثر ۲ فرزند دارد: فرزند چپ و فرزند راست.
class BinaryNode:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
انواع خاص درخت دودویی
- کامل (Full): هر گره ۰ یا ۲ فرزند دارد
- تام (Complete): همه سطحها پر، جز آخرین که از چپ پر شده (مبنای هیپ!)
- متعادل (Balanced): ارتفاع زیردرخت چپ و راست هر گره حداکثر ۱ اختلاف
- کج (Degenerate): هر گره فقط یک فرزند — عملاً لیست پیوندی! (بدترین حالت)
پیمایشهای سهگانه DFS
محل بازدید گره نسبت به پیمایش فرزندان، سه نوع را میسازد:
۱. Preorder (ریشه ← چپ ← راست)
اول خود گره، بعد چپ، بعد راست. کاربرد: کپی درخت، سریالسازی، پیشوندهای عبارت.
۲. Inorder (چپ ← ریشه ← راست)
اول چپ، بعد خود گره، بعد راست. کاربرد: در BST، خروجی مرتبشده است!
۳. Postorder (چپ ← راست ← ریشه)
اول هر دو فرزند، بعد خود گره. کاربرد: حذف درخت (اول فرزندان!)، پسوندهای عبارت، محاسبه فضای دیسک پوشهها.
مثال یکسان، سه خروجی
1
/ \
2 3
/ \
4 5
Preorder: 1, 2, 4, 5, 3
Inorder: 4, 2, 5, 1, 3
Postorder: 4, 5, 2, 3, 1
جدول کاربردها
| پیمایش | ترتیب | کاربرد اصلی |
|---|---|---|
| Preorder | ریشه-چپ-راست | کپی/سریالسازی درخت |
| Inorder | چپ-ریشه-راست | خروجی مرتب BST |
| Postorder | چپ-راست-ریشه | حذف درخت، محاسبه از پایین |
| Level-order | سطح به سطح | کوتاهترین مسیر، چاپ سطحی |
نکته حفظی: نام پیمایش از «جایگاه ریشه» میآید — Pre یعنی ریشه اول، In یعنی ریشه وسط، Post یعنی ریشه آخر!
جمعبندی
- درخت دودویی: حداکثر ۲ فرزند (چپ و راست)
- سه پیمایش DFS از جایگاه ریشه نام میگیرند
- Inorder روی BST = خروجی مرتب
- درخت کج = افت کارایی به O(n) — خطر!
این مبحث بخشی از دوره آموزش کامل ساختار داده و الگوریتم است.