গাছটিকে চ্যাপ্টা না করে এটি করার একটি উপায়।
সংজ্ঞা থেকে, এখানে,
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
যদি কোনও নোড সেই নোডে থাকা পুরো সাবট্রিটিকে অতিক্রম না করে অনুসন্ধান সম্পত্তি লঙ্ঘন করে আপনি তাড়াতাড়ি ফিরে আসতে পারেন।