ধারণা
একটি প্রদত্ত ব্যালেন্সড বাইনারি সার্চ ট্রি এবং একটি টার্গেট যোগফলের ক্ষেত্রে, আমরা একটি ফাংশন লিখি যা সঠিক যোগফলের সাথে লক্ষ্য যোগফলের সমতুল্য যোগফল থাকলে, অন্যথায় মিথ্যা ফেরত দেয়। এই ক্ষেত্রে, প্রত্যাশিত সময়ের জটিলতা হল O(n) এবং শুধুমাত্র O(Logn) অতিরিক্ত স্থান প্রয়োগ করা যেতে পারে। এখানে, বাইনারি সার্চ ট্রিতে কোনো পরিবর্তনের অনুমতি নেই। আমাদের মনে রাখতে হবে যে একটি ব্যালেন্সড BST-এর উচ্চতা সর্বদা O(Logn) হয়।
উদাহরণ
পদ্ধতি
ব্রুট ফোর্স সলিউশন অনুসারে, আমরা BST-তে প্রতিটি জোড়া বিবেচনা করি এবং সমষ্টি X এর সমান কিনা তা যাচাই করি। এই সমাধানের সময় জটিলতা হবে O(n^2)।
এখন একটি ভাল সমাধান হল একটি সহায়ক অ্যারে তৈরি করা এবং অ্যারেতে BST-এর Inorder traversal সংরক্ষণ করা। এই ক্ষেত্রে, অ্যারেটি সাজানো হবে কারণ বিএসটি-এর ইনঅর্ডার ট্রাভার্সাল সর্বদা সাজানো ডেটা তৈরি করে। তাই একবার ইনঅর্ডার ট্রাভার্সালের উপলব্ধতার পরে, আমরা O(n) সময়ে জোড়া দিতে পারি। মনে রাখবেন, এই সমাধানটি O(n) সময়ে কাজ করে, কিন্তু O(n) সহায়ক স্থান প্রয়োজন।
উদাহরণ
একটি ব্যালেন্সড BSTimport java.util.ArrayList;// একটি বাইনারি ট্রি নোডেক্লাস Node1 { int data1; Node1 left1, right1; Node1(int d){ data1 =d; left1 =right1 =null; }}পাবলিক ক্লাস BinarySearchTree {// BST Node1 root1 এর মূল নির্দেশ করে; // কনস্ট্রাক্টরকে নির্দেশ করে BinarySearchTree(){ root1 =null; } // গাছের ইনঅর্ডার ট্রাভার্সাল নির্দেশ করে void inorder(){ inorderUtil1(this.root1); } // ট্রি ভয়েড inorderUtil1(Node1 node1){ if (node1 ==null) রিটার্নের ইনঅর্ডার ট্রাভার্সালের জন্য ইউটিলিটি ফাংশন নির্দেশ করে; inorderUtil1(node1.left1); System.out.print(node1.data1 + ""); inorderUtil1(node1.right1); } // এখন এই পদ্ধতিটি প্রধানত insertRec() void insert(int key1){ root1 =insertRec1(root1, key1); } /* BST এ একটি নতুন কী সন্নিবেশ করার জন্য একটি পুনরাবৃত্ত ফাংশন নির্দেশ করে */ Node1 insertRec1(Node1 root1, int data1){ /* সুতরাং গাছটি খালি থাকলে, একটি নতুন নোড ফেরত দিন */ if (root1 ==null) { root1 =new Node1(data1); রিটার্ন রুট 1; } /* অন্যথায়, ট্রি ডাউন করুন */ if (data1আউটপুট
জোড়া পাওয়া গেছে:13 + 21 =34