AlgoVerse

پیمایش سطح‌به‌سطح

گره‌های درخت را سطح‌به‌سطح، از بالا به پایین و از چپ به راست، با یک صف ملاقات می‌کند؛ همان BFS روی درخت.

پیمایش‌های پیش‌ترتیب، میان‌ترتیب و پس‌ترتیب عمقیاند: تا ته یک شاخه می‌روند. پیمایش سطح‌به‌سطح اول همه‌ی گره‌های عمق ۰، بعد عمق ۱، بعد عمق ۲ و ... را ملاقات می‌کند.

ادامه‌ی توضیح ↓
ورودی:
n=7خروجی PDF

همان درخت پیمایش‌های عمقی؛ خروجی ۱۵، ۶، ۱۸، ۳، ۷، ۱۷، ۲۰ است: سطح‌به‌سطح.

  1. from collections import deque
  2. class Node:
  3. def __init__(self, key):
  4. self.key = key
  5. self.left = None
  6. self.right = None
  7. def level_order(root):
  8. out = []
  9. if root is None:
  10. return out
  11. queue = deque([root])
  12. while queue:
  13. node = queue.popleft()
  14. out.append(node.key)
  15. if node.left is not None:
  16. queue.append(node.left)
  17. if node.right is not None:
  18. queue.append(node.right)
  19. return out

ناوردا: صف همیشه گره‌های باقی‌مانده‌ی سطح فعلی و بعد گره‌های اول سطح بعدی را به ترتیب چپ به راست دارد.

شروع اجرا

36715171820

متغیرهای محلی

نارنجی = در همین گام عوض شد

root object

  • key = 15
  • left = Node(key=6, left=Node(key=3, left=None, right=None), right=Node(key=7, left=None, right=None))
  • right = Node(key=18, left=Node(key=17, left=None, right=None), right=Node(key=20, left=None, right=None))

Call stack

  1. level_order()خط 11
گام ۱ از ۴۷
خط سیاه = visit · خط نارنجی = گام کلیدیstart: 0/1 · visit: 0/7 · enqueue: 0/6

    رشد تعداد عملیات با اندازه‌ی ورودی

    میانگین ۸ گراف تصادفی برای هر n (با seed ثابت). نشانگر توخالی = ورودی فعلی.

    • visit
    • ورودی فعلی (n=7)
    0510153579111315n = تعداد کلیدهاvisit
    نمایش به شکل جدول
    nvisit
    33
    55
    77
    99
    1111
    1313
    1515
    توضیح

    ایده

    پیمایش‌های پیش‌ترتیب، میان‌ترتیب و پس‌ترتیب عمقیاند: تا ته یک شاخه می‌روند. پیمایش سطح‌به‌سطح اول همه‌ی گره‌های عمق ۰، بعد عمق ۱، بعد عمق ۲ و ... را ملاقات می‌کند.

    الگوریتم

    یک صف (اول‌وارد، اول‌خارج):

    1. ریشه را در صف بگذار.
    2. تا صف خالی نشده: گره‌ی اول صف را بردار، ملاقاتش کن و فرزندان چپ و راستش را به ته صف اضافه کن.

    این همان BFS روی گراف است؛ چون درخت دور ندارد، نیازی به علامت‌گذاری «دیده‌شده» نیست.

    هزینه

    هر گره یک بار وارد و یک بار خارج صف می‌شود: O(n). صف حداکثر به اندازه‌ی پهن‌ترین سطح بزرگ می‌شود.

    در trace به چه چیزی نگاه کنی

    • گره‌های ملاقات‌شده پررنگ می‌شوند؛ صف در پنل حافظه است.