Փնտրման բինար ծառը (BST) բինար ծառի հատուկ տեսակ է, որը ենթարկվում է երկու հիմնական պայմանների:
Բոլոր ձախ որդի հանգույցները(parent) փոքր արժեք ունեն, քան ծնող հանգույցը
Բոլոր աջ որդի հանգույցները(parent) մեծ արժեք ունեն, քան ծնող հանգույցը
Այսպիսով, յուրաքանչյուր հանգույց կա՛մ երեխաներ չունի, կա՛մ ձախ կողմում ունի ավելի փոքր արժեքով հանգույց և աջ կողմում՝ ավելի մեծ արժեքով հանգույց։
Փնտրման բինար ծառ 8 հանգույցներով
Այս հատկությունը հատկապես օգտակար է բինար ծառում արժեքների որոնման համար։ Եթե փնտրում ենք արժեք x, ապա միշտ գիտենք, թե որ ուղղությամբ շարժվել տվյալ արժեքը գտնելու համար։ Վերևում բերված օրինակով, եթե ուզում ենք գտնել 3 արժեքով հանգույցը, նախ նայում ենք արմատ (root) հանգույցին, որն ունի 5 արժեքը։ Քանի որ 5-ը մեծ է 3-ից, անցնում ենք ձախ։ Այնտեղ կա 2 արժեքով հանգույց, իսկ چون 2-ը փոքր է 3-ից, գնում ենք աջ։ Հաջորդ հանգույցը 4 է, իսկ 4-ը մեծ է 3-ից, ուստի կրկին ձախ ենք անցնում։ Այստեղ արդեն գտնում ենք 3 արժեքով հանգույցը, և քանի որ այն հավասար է մեր փնտրած 3-ին, նշանակում է, որ համապատասխան հանգույցը գտնվել է։
# Ենթադրենք, որ չգործող հանգույցները None են՝ արժեք 0-ի փոխարեն
def search(node: Node | None, x: int):
""" Return True if x is present in the tree and False otherwise """
if node is None: # Եթե հասել ենք ծառի ավարտին
return False # Չգտանք արժեքը x
if x == node.value: # Եթե x-ը հավասար է node.value-ին
return True # => գտել ենք x արժեքը ծառում
if x < node.value: # Եթե x-ը փոքր է => պետք է գնանք ձախ
return search(node.left) # Փնտրում ենք x-ը ձախ ենթածառում
return search(node.right) # Հակառակ դեպքում փնտրում ենք աջ ենթածառում
Այսպիսի որոնումը բավականին արդյունավետ է, եթե ծառըComparatively ցածր բարձրություն ունի։ Յուրաքանչյուր քայլում շարժվում ենք կամ ձախ, կամ աջ ենթածառ, ուստի վատագույն դեպքում որոնման գործողությունների քանակը համարժեք է ծառի բարձրությանը։
Առաջադրանք: Ստուգել, արդյոք տրված ծառը BST է
Ձեզ խնդրում են ստուգել, թե արդյոք տրված բինար ծառը փնտրման բինար ծառ է (BST)։
Մուտք
Մուտքը պարունակում է տարածքով բաժանված ամբողջ թվեր, որոնք ներկայացնում են բինար ծառի հանգույցների արժեքները։ Արժեքը տրվում է ամեն անգամ նախ ձախ, ապա աջ ենթածառը遍iterելիս։ 0 արժեքը նշանակում է, որ տվյալ հանգույցը չի գոյություն ունենում։ Երաշխավորված է, որ մուտքագրված բինար ծառը վավեր է և արժեքները եզակի են։
Ելք
Ծրագիրը պետք է տպի Yes, եթե բինար ծառը փնտրման բինար ծառ է, հակառակ դեպքում No։
Օրինակներ
Мուտք
Ելք
1 2 3 8 5 0 0 0 0 5 8 0 0 0 0
No
5 2 7 1 4 0 0 3 0 0 0 6 8 0 0 0 0
Yes
Բացատրություն
Օրինակ 1: Թեև բոլոր աջ կողմի հանգույցները մեծ են իրենց ծնող հանգույցներից, ձախ կողմի հանգույցներից որոշները parent-ից փոքր չեն։
Օրինակ 2: Այն բինար ծառ է, որտեղ ձախ կողմի բոլոր հանգույցները փոքր են ծնող հանգույցից, իսկ աջ կողմի հանգույցները մեծ են ծնող հանգույցից։