درخت دودویی نخکشیشده
پیوندهای راست خالی درخت را به جانشین میانترتیب هر گره وصل میکند (نخ)؛ بعد پیمایش میانترتیب بدون پشته و بدون بازگشت انجام میشود.
در درخت دودویی با n گره، n + 1 پیوند تهی هست. Perlis و Thornton پیشنهاد کردند این پیوندها هدر نروند: پیوند راست تهی هر گره به جانشین میانترتیب آن اشاره کند. به این پیوندها نخ (thread) میگویند. (نسخهی کامل، پیوندهای چپ تهی را هم به پیشینِ میانترتیب وصل میکند.)
- زمان:
Θ(n) - حافظه:
O(1) extra for the walk - هوروویتز–ساهنی، فصل ۵
درخت جستجوی هفتگرهای؛ سه نخ کشیده میشود (۳→۶، ۷→۱۵ و ۱۷→۱۸) و پیمایش ۳ ۶ ۷ ۱۵ ۱۷ ۱۸ ۲۰ را بدون پشته میدهد.
class Node:def __init__(self, key):self.key = keyself.left = Noneself.right = Noneself.thread = None # used only when right is empty: the inorder successordef threaded(root):# Phase 1: an inorder walk; every node with an empty right link gets a thread to its successor.stack = []prev = Nonenode = rootwhile node is not None or stack:if node is not None:stack.append(node)node = node.leftelse:node = stack.pop()if prev is not None and prev.right is None:prev.thread = nodeprev = nodenode = node.right# Phase 2: inorder again, with no stack: follow a thread, or go right and then all the way left.out = []node = rootwhile node is not None and node.left is not None:node = node.leftwhile node is not None:out.append(node.key)if node.right is None:node = node.threadelse:node = node.rightwhile node.left is not None:node = node.leftreturn out
شروع اجرا
متغیرهای محلی
نارنجی = در همین گام عوض شد
root object
- key = 15
- left = Node(key=6, left=Node(key=3, left=None, right=None, thread=None), right=Node(key=7, left=None, right=None, thread=None), thread=None)
- right = Node(key=18, left=Node(key=17, left=None, right=None, thread=None), right=Node(key=20, left=None, right=None, thread=None), thread=None)
- thread = None
Call stack
- threaded()خط 9
توضیح
ایده
در درخت دودویی با n گره، n + 1 پیوند تهی هست. Perlis و Thornton پیشنهاد کردند این پیوندها هدر نروند: پیوند راست تهی هر گره به جانشین میانترتیب آن اشاره کند. به این پیوندها نخ (thread) میگویند. (نسخهی کامل، پیوندهای چپ تهی را هم به پیشینِ میانترتیب وصل میکند.)
پیمایش بدون پشته
با نخها، از هر گره گرهی بعدی میانترتیب راحت پیدا میشود:
- اگر فرزند راست دارد: یکی به راست و بعد تا جایی که میشود به چپ،
- وگرنه: نخش را دنبال کن.
پس پیمایش میانترتیب بدون پشته و بدون بازگشت انجام میشود.
در عمل
باید بدانیم پیوند راست یک گره فرزند واقعی است یا نخ. کتابها برای این یک بیت پرچم در هر گره نگه میدارند؛ اینجا نخ در فیلد جدای thread است. نخها با خطچین کشیده شدهاند.