کپی و برابری دو درخت
دو الگوریتم بازگشتی کوتاه: کپی یک درخت دودویی گره به گره، و بررسی اینکه دو درخت هم شکل و هم کلیدهایشان یکی است؛ هر دو O(n).
یک درخت دودویی را با پیمایش پیشترتیب کپی میکنیم: گرهی تازه با همان کلید بساز، بعد زیردرخت چپ و راست را به صورت بازگشتی کپی کن و به آن وصل کن. هر گره یک بار کپی میشود: O(n).
- زمان:
O(n) - حافظه:
O(h) for the recursion - هوروویتز–ساهنی، فصل ۵
A و B همان کلیدها با دو ترتیب درجاند که به یک درخت میرسند؛ a کپی میشود و a و b برابرند.
class Node:def __init__(self, key):self.key = keyself.left = Noneself.right = Nonedef copy_and_compare(A, B):a = build(A[0])b = build(B[0])c = copy(a)same = equal(a, b)return samedef copy(node):if node is None:return Nonet = Node(node.key)t.left = copy(node.left)t.right = copy(node.right)return tdef equal(x, y):if x is None and y is None:return Trueif x is None or y is None:return Falseif x.key != y.key:return Falsematch = x.keyreturn equal(x.left, y.left) and equal(x.right, y.right)def build(keys):# A binary search tree from the keys in this insertion order.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
- copy_and_compare()خط 8
توضیح
کپی
یک درخت دودویی را با پیمایش پیشترتیب کپی میکنیم: گرهی تازه با همان کلید بساز، بعد زیردرخت چپ و راست را به صورت بازگشتی کپی کن و به آن وصل کن. هر گره یک بار کپی میشود: O(n).
برابری
دو درخت برابرند اگر هر دو تهی باشند، یا ریشههایشان کلید یکسان داشته باشند و زیردرختهای چپ و راستشان هم (به صورت بازگشتی) برابر باشند. به محض اولین تفاوت (در شکل یا کلید) جواب «نه» است.
نکته
یک مجموعه کلید با ترتیبهای درج متفاوت میتواند به درخت جستجوی دودویی یکسان یا متفاوت برسد؛ پیشتنظیمها هر دو حالت را نشان میدهند.
ورودی
A و B ترتیب درج کلیدها در دو درخت جستجوی دودویی a و b اند.