কম্পিউটার

জাভাতে একটি সুষম BST-এ প্রদত্ত যোগফলের সাথে একটি জোড়া খুঁজুন


ধারণা

একটি প্রদত্ত ব্যালেন্সড বাইনারি সার্চ ট্রি এবং একটি টার্গেট যোগফলের ক্ষেত্রে, আমরা একটি ফাংশন লিখি যা সঠিক যোগফলের সাথে লক্ষ্য যোগফলের সমতুল্য যোগফল থাকলে, অন্যথায় মিথ্যা ফেরত দেয়। এই ক্ষেত্রে, প্রত্যাশিত সময়ের জটিলতা হল O(n) এবং শুধুমাত্র O(Logn) অতিরিক্ত স্থান প্রয়োগ করা যেতে পারে। এখানে, বাইনারি সার্চ ট্রিতে কোনো পরিবর্তনের অনুমতি নেই। আমাদের মনে রাখতে হবে যে একটি ব্যালেন্সড BST-এর উচ্চতা সর্বদা O(Logn) হয়।

উদাহরণ

জাভাতে একটি সুষম BST-এ প্রদত্ত যোগফলের সাথে একটি জোড়া খুঁজুন

পদ্ধতি

ব্রুট ফোর্স সলিউশন অনুসারে, আমরা 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 root1.data1) root1.right1 =insertRec1(root1.right1, data1); রিটার্ন রুট 1;}// পদ্ধতি নির্দেশ করে যা প্রদত্ত BST এর মানগুলিকে ArrayList// এ যোগ করে এবং তাই ArrayListArrayList treeToList(Node1 node1, ArrayList list1){// নির্দেশ করে বেস কেস যদি (node1 ==null) ফিরতি তালিকা 1; treeToList(node1.left1, list1); list1.add(node1.data1); treeToList(node1.right1, list1); রিটার্ন তালিকা 1;}// পদ্ধতি নির্দেশ করে যা একটি জোড়া প্রেজেন্টবুলিয়ান isPairPresent(Node1 node1, int target1) আছে কিনা তা পরীক্ষা করে{ // এখন এই তালিকা a1 একটি যুক্তি হিসাবে পাস করা হয়েছে // treeToList পদ্ধতিতে // যা পরে পূরণ করা হয় BST ArrayList a1 =নতুন ArrayList<>(); // এখন a2 তালিকায় BST-এর সমস্ত মান রয়েছে // treeToList পদ্ধতি ArrayList a2 =treeToList(node1, a1); int start1 =0; // a2 int end1 =a2.size() - 1 এর প্রারম্ভিক সূচক নির্দেশ করে; // a2 এর শেষ সূচক নির্দেশ করে যখন (start1

আউটপুট

জোড়া পাওয়া গেছে:13 + 21 =34

  1. C++ এ একটি সুষম BST-এ প্রদত্ত যোগফল সহ একটি জোড়া খুঁজুন

  2. পাইথনে বিএসটি-তে প্রদত্ত যোগফল সহ একটি ট্রিপলেট বিদ্যমান কিনা তা পরীক্ষা করুন

  3. প্রদত্ত যোগফলের সাথে জোড়া খুঁজুন যাতে পাইথনের বিভিন্ন BST-এ জোড়া উপাদান থাকে

  4. প্রদত্ত যোগফলের সাথে জোড়া খুঁজুন যাতে পাইথনে জোড়ার উপাদানগুলি বিভিন্ন সারিতে থাকে