গাছটিকে চ্যাপ্টা না করে এটি করার একটি উপায়।
সংজ্ঞা থেকে, এখানে,
data BinaryTree a = Null | Node (BinaryTree a) a (BinaryTree a)
deriving Show
আপনি দেখতে পাচ্ছেন যে গাছটিকে বাম থেকে ডান দিকে অগ্রসর করা, উপেক্ষা Nodeএবং প্রথম বন্ধনী আপনাকে Nullআর aএস এর একটি বিকল্প ক্রম দেয় । যে, প্রতি দুটি মানের মধ্যে একটি আছে Null।
আমার পরিকল্পনাটি হ'ল যে প্রতিটি সাবট্রি উপযুক্ত প্রয়োজনীয়তাগুলি সন্তুষ্ট করে : আমরা প্রতিটিটি প্রয়োজনীয়তাগুলি পরিমার্জন করতে পারি Node, আমরা কোন মানগুলির মধ্যে রয়েছি তা মনে করে তারপরে সেগুলি পরীক্ষা করে Null। যেহেতু Nullপ্রতিটি ক্রমের মানগুলির মধ্যে একটির মধ্যে একটি রয়েছে, আমরা পরীক্ষা করে দেখেছি যে সমস্ত ক্রম (বাম থেকে ডানে) জোড়া হ্রাস-হ্রাসযুক্ত।
প্রয়োজনীয়তা কী? এটি গাছের মানগুলির উপর একটি আলগা নিম্ন এবং উপরের আবদ্ধ। বাম দিকের এবং ডানদিকের প্রান্তগুলি সহ প্রয়োজনীয়তা প্রকাশের জন্য, আমরা Botটম এবং Topউপাদানগুলির সাথে কোনও ক্রম বাড়িয়ে দিতে পারি , নিম্নরূপ:
data TopBot a = Bot | Val a | Top deriving (Show, Eq, Ord)
এখন আসুন আমরা পরীক্ষা করে দেখি যে একটি প্রদত্ত গাছ ক্রমযুক্ত এবং প্রদত্ত সীমাগুলির মধ্যে উভয়ই হওয়ার প্রয়োজনীয়তাগুলি পূরণ করে।
ordBetween :: Ord a => TopBot a -> TopBot a -> BinaryTree a -> Bool
-- tighten the demanded bounds, left and right of any Node
ordBetween lo hi (Node l x r) = ordBetween lo (Val x) l && ordBetween (Val x) hi r
-- check that the demanded bounds are in order when we reach Null
ordBetween lo hi Null = lo <= hi
একটি বাইনারি অনুসন্ধান বৃক্ষ একটি গাছ অনুক্রমে এবং মধ্যে যে Botএবং Top।
isBSTree :: Ord a => BinaryTree a -> Bool
isBSTree = ordBetween Bot Top
কম্পিউটিং প্রকৃত প্রতিটি সাবট্রি মধ্যে একস্ট্রিমাল মূল্যবোধ, তাদের বাহিরের দিকে সাড়া জাগানো, আপনি আরও তথ্য চেয়ে আপনার যা দরকার দেয়, এবং প্রান্ত যখােন বাম বা ডান subtree খালি মধ্যে fiddly হয়। বজায় রাখার এবং পরীক্ষণ প্রয়োজনীয়তা , তাদের চিন্তায় ঠেলাঠেলি, বরং আরো অভিন্ন নয়।
flattenTreeপ্রথমে সংজ্ঞায়িত করব নাFalseযদি কোনও নোড সেই নোডে থাকা পুরো সাবট্রিটিকে অতিক্রম না করে অনুসন্ধান সম্পত্তি লঙ্ঘন করে আপনি তাড়াতাড়ি ফিরে আসতে পারেন।