AlgoVerse

پیمایش میان‌ترتیب و پیش‌ترتیب بدون بازگشت

پیمایش درخت دودویی با یک پشته‌ی صریح به جای بازگشت: همان ترتیب‌ها، ولی پشته‌ای که بازگشت پنهان می‌کرد دیده می‌شود.

پیمایش بازگشتی در واقع از پشته‌ی فراخوانی استفاده می‌کند. اگر خودمان پشته را نگه داریم، به بازگشت نیازی نیست و پشته دیده می‌شود.

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

درخت جستجوی هفت‌گره‌ای؛ میان‌ترتیب ۳ ۶ ۷ ۱۵ ۱۷ ۱۸ ۲۰ (مرتب) و پیش‌ترتیب ۱۵ ۶ ۳ ۷ ۱۸ ۱۷ ۲۰.

  1. class Node:
  2. def __init__(self, key):
  3. self.key = key
  4. self.left = None
  5. self.right = None
  6. def iterative(root):
  7. stack = []
  8. on_stack = [] # the keys of the nodes on the stack, for the picture
  9. # Inorder: go left as far as possible, pushing each node; then pop, visit, and go right.
  10. ino = []
  11. out = ino
  12. node = root
  13. while node is not None or stack:
  14. if node is not None:
  15. stack.append(node)
  16. on_stack.append(node.key)
  17. node = node.left
  18. else:
  19. node = stack.pop()
  20. on_stack.pop()
  21. ino.append(node.key)
  22. node = node.right
  23. # Preorder: pop and visit; push the right child first so the left one comes out first.
  24. pre = []
  25. out = pre
  26. if root is not None:
  27. stack.append(root)
  28. on_stack.append(root.key)
  29. while stack:
  30. node = stack.pop()
  31. on_stack.pop()
  32. pre.append(node.key)
  33. if node.right is not None:
  34. stack.append(node.right)
  35. on_stack.append(node.right.key)
  36. if node.left is not None:
  37. stack.append(node.left)
  38. on_stack.append(node.left.key)
  39. return ino, pre

ناوردا: در میان‌ترتیب، پشته همان گره‌هایی است که زیردرخت چپشان در حال پیمایش است و هنوز خودشان دیده نشده‌اند.

شروع اجرا

36715171820
on_stack—
ino—
pre—

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

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

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. iterative()خط 8
گام ۱ از ۱۴۵
خط سیاه = visit_in, visit_pre · خط نارنجی = گام کلیدیpush: 0/13 · visit_in: 0/7 · start_pre: 0/1 · visit_pre: 0/7
    توضیح

    ایده

    پیمایش بازگشتی در واقع از پشته‌ی فراخوانی استفاده می‌کند. اگر خودمان پشته را نگه داریم، به بازگشت نیازی نیست و پشته دیده می‌شود.

    • میان‌ترتیب: تا جایی که می‌شود به چپ برو و هر گره را در پشته بگذار. وقتی به تهی رسیدی، یکی بردار، ببینش و به زیردرخت راستش برو.
    • پیش‌ترتیب: ریشه را در پشته بگذار؛ هر بار یکی بردار، ببینش و اول فرزند راست و بعد چپ را در پشته بگذار تا چپ زودتر بیرون بیاید.

    هزینه

    هر گره یک بار وارد و یک بار خارج پشته می‌شود: Θ(n). پشته حداکثر به اندازه‌ی ارتفاع درخت (h) رشد می‌کند.

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

    • on_stack کلیدهای پشته است (ته پشته سمت چپ). زنجیره‌ی چپ و راست را مقایسه کن.