یکریختی درختها
بررسی میکند آیا دو درخت ریشهدار با جابهجا کردن فرزندان به هم تبدیل میشوند: به هر زیردرخت از پایین به بالا یک نام متعارف میدهد و نام دو ریشه را مقایسه میکند.
دو درخت ریشهدار یکریختاند اگر بشود با جابهجا کردن فرزندان گرهها (و نادیده گرفتن برچسبها) یکی را به دیگری تبدیل کرد.
ادامهی توضیح ↓- زمان:
O(n²) with strings (O(n) with integer names) - حافظه:
O(n) - جانسونباو، فصل ۹
b آینهی a است: هر جا a فرزند چپ دارد، b فرزند راست دارد. شکلها فرق دارند ولی درختها یکریختاند.
class Node:def __init__(self, key):self.key = keyself.left = Noneself.right = Nonedef isomorphic(A, B):a = build(A[0])b = build(B[0])name_a = name(a)name_b = name(b)same = name_a == name_breturn samedef name(node):# The canonical name of a subtree: its children's names in sorted order, wrapped in brackets.if node is None:return ""first = name(node.left)second = name(node.right)if first > second:first, second = second, firsts = "(" + first + second + ")"return sdef build(keys):# A binary search tree from the keys in this insertion order; only its shape matters here.root = Nonefor k in keys:node = Node(k)if root is None:root = nodecontinuep = rootwhile True:if k < p.key:if p.left is None:p.left = nodebreakp = p.leftelse:if p.right is None:p.right = nodebreakp = p.rightreturn root
شروع اجرا
∅
∅
درخت فراخوانیهای بازگشتی
نارنجی پر = فراخوانی در حال اجرا · حاشیهی نارنجی = هنوز روی پشته · خاکستری = تمام شده
متغیرهای محلی
نارنجی = در همین گام عوض شد
A list
B list
Call stack
- isomorphic()خط 8
توضیح
مسئله
دو درخت ریشهدار یکریختاند اگر بشود با جابهجا کردن فرزندان گرهها (و نادیده گرفتن برچسبها) یکی را به دیگری تبدیل کرد.
ایده: نام متعارف (Aho–Hopcroft–Ullman)
به هر زیردرخت از پایین به بالا یک نام میدهیم:
- درخت تهی نام تهی دارد،
- نام یک گره =
(+ نام فرزندانش به ترتیب مرتب +).
مرتب کردن نام فرزندان یعنی ترتیب چپ و راست اهمیتی ندارد. دو درخت یکریختاند اگر و تنها اگر نام ریشههایشان یکی باشد.
هزینه
با رشتهها، ساختن نامها میتواند O(n²) باشد؛ نسخهی AHU به جای رشته به هر نام یک عدد صحیح میدهد و به O(n) میرسد.
ورودی
A و B ترتیب درج کلیدها در دو درخت جستجوی دودوییاند؛ فقط شکل این درختها مقایسه میشود.