কম্পিউটার

C++ এ একটি প্রদত্ত বাইনারি ট্রিতে বৃহত্তম সম্পূর্ণ সাবট্রি খুঁজুন


ধারণা

একটি প্রদত্ত বাইনারি গাছের ক্ষেত্রে, কাজটি হল প্রদত্ত বাইনারি ট্রিতে সর্বাধিক সম্পূর্ণ উপ-বৃক্ষের আকার নির্ধারণ করা৷

সম্পূর্ণ বাইনারি ট্রি - একটি বাইনারি গাছকে সম্পূর্ণ বাইনারি ট্রি হিসাবে গণ্য করা হয় যদি সমস্ত স্তরগুলি সম্ভবত শেষ স্তরটি ছাড়াই সম্পূর্ণরূপে পূর্ণ হয় এবং শেষ স্তরে যতটা সম্ভব সমস্ত কীগুলি অবশিষ্ট থাকে৷ এটি উল্লেখ করা হয়েছে যে সমস্ত পারফেক্ট বাইনারি গাছ সম্পূর্ণ বাইনারি গাছ কিন্তু বিপরীত সত্য নয়। দেখা গেছে একটি গাছ সম্পূর্ণ না হলে তা পারফেক্ট বাইনারি ট্রিও নয়।

ইনপুট

      2
     / \
    3   4
   / \  / \
  5   6 7  8
 / \ /
9 10 11

আউটপুট

Size : 10
Inorder Traversal : 9 5 10 3 11 6 2 7 4 8
The above given tree is a complete binary tree.

ইনপুট

      51
     / \
   31    61
   / \   / \
  6 21 46   71
 /
11

আউটপুট

Size : 4(With respect of right subtree)
Inorder Traversal : 11 46 61 71
The above given tree is not a complete binary tree.

পদ্ধতি

সহজভাবে নীচে আপ পদ্ধতিতে গাছ পরিদর্শন করুন. পরবর্তীতে সন্তান থেকে পিতামাতার কাছে পুনরাবৃত্ত আসার বিষয়ে, আমরা উপ-বৃক্ষ সম্পর্কে তথ্য পিতামাতার কাছে স্থানান্তর করতে পারি। স্থানান্তরিত তথ্য শুধুমাত্র ধ্রুবক সময়ে সম্পূর্ণ ট্রি পরীক্ষা (অভিভাবক নোডের জন্য) করার জন্য পিতামাতা দ্বারা প্রয়োগ করা যেতে পারে। এই ক্ষেত্রে, বাম এবং ডান উপ-বৃক্ষ উভয়েরই অভিভাবকদের তথ্য জানাতে হবে যে তারা নিখুঁত বা না এবং সম্পূর্ণ বা না এবং তাদের এখন পর্যন্ত পাওয়া সম্পূর্ণ বাইনারি গাছের সর্বাধিক আকার ফেরত দিতে হবে।

আমাদের লক্ষ্য করা উচিত যে সাব-ট্রিগুলিকে সর্ববৃহৎ সম্পূর্ণ উপ-বৃক্ষ নির্ধারণের জন্য নিম্নলিখিত তথ্যগুলিকে গাছের উপরে স্থানান্তর করতে হবে যাতে আমরা সম্পূর্ণ বাইনারি ট্রি সম্পত্তি যাচাই করার জন্য পিতামাতার ডেটার সাথে সর্বাধিক আকারের তুলনা করতে পারি৷

  • বাম শিশু বা ডান শিশু উপ-বৃক্ষটি নিখুঁত এবং সম্পূর্ণ কিনা তা যাচাই করার জন্য একটি বুল ভেরিয়েবল থাকা উচিত।

  • আবার আমাদের যাচাই করতে হবে যে বাম এবং ডান শিশু কল থেকে আমরা 3টি ক্ষেত্রে অনুসরণ করে প্যারেন্ট সাব-ট্রি সম্পূর্ণ কিনা তা খুঁজে বের করতে পারি -

    • এটা দেখা গেছে যে যদি বাম উপবৃক্ষ নিখুঁত হয় এবং ডানটি সম্পূর্ণ হয় এবং উচ্চতাও একই থাকে তবে উপ-বৃক্ষের মূলটিকেও বাম এবং ডান উপবৃক্ষ প্লাস ওয়ান (বর্তমান মূলের জন্য) এর সমষ্টির সমান আকার সহ সম্পূর্ণ বাইনারি সাবট্রি হিসাবে গণ্য করা হয়।

    • এটা দেখা গেছে যে যদি বাম উপবৃক্ষ সম্পূর্ণ এবং ডান নিখুঁত হয় এবং বামের উচ্চতা ডানের চেয়ে এক দ্বারা বড় হয় তবে সাব-ট্রি রুটটি সম্পূর্ণ বাইনারি সাবট্রি হয় যার আকার বাম এবং ডান সাবট্রি প্লাস ওয়ানের যোগফলের সমান (বর্তমান মূলের জন্য) . কিন্তু রুট সাবট্রিকে নিখুঁত বাইনারি সাবট্রি হিসাবে ঘোষণা করা যায় না কারণ এই ক্ষেত্রে এর বাম সন্তান নিখুঁত নয়।

    • অন্যথায় এই উপ-বৃক্ষটিকে একটি সম্পূর্ণ বাইনারি গাছ হিসাবে গণ্য করা যায় না এবং কেবলমাত্র বাম বা ডান উপ-বৃক্ষে এখন পর্যন্ত পাওয়া বৃহত্তম আকারের সম্পূর্ণ উপ-বৃক্ষটি ফিরিয়ে দিন। সুতরাং এই সিদ্ধান্তে আসা যেতে পারে যে যদি গাছটি সম্পূর্ণ না হয় তবে তা নয়। এছাড়াও নিখুঁত।

উদাহরণ

//This is a C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
// Node structure of the tree
struct node1 {
   int data;
   struct node1* left;
   struct node1* right;
};
// For creating a new node
struct node1* newNode(int data){
   struct node1* node1 = (struct node1*)malloc(sizeof(struct node1));
   node1->data = data;
   node1->left = NULL;
   node1->right = NULL;
   return node1;
};
// Shows structure for return type of
// function findPerfectBinaryTree
struct returnType {
   // For storing if sub-tree is perfect or not
   bool isPerfect;
   // For storing if sub-tree is complete or not
   bool isComplete;
   // Indicates size of the tree
   int size1;
   // Root of biggest complete sub-tree
   node1* rootTree;
};
// Shows helper function that returns height
// of the tree given size
int getHeight(int size1){
   return ceil(log2(size1 + 1));
}
// Shows function to return the biggest
// complete binary sub-tree
returnType findCompleteBinaryTree(struct node1* root){
   // Declaring returnType that
   // needs to be returned
   returnType rt1;
   // If root is NULL then it is considered as both
   // perfect and complete binary tree of size 0
   if (root == NULL) {
      rt1.isPerfect = true;
      rt1.isComplete = true;
      rt1.size1 = 0;
      rt1.rootTree = NULL;
      return rt1;
   }
   // Shows recursive call for left and right child
   returnType lv1 = findCompleteBinaryTree(root->left);
   returnType rv1 = findCompleteBinaryTree(root->right);
   // CASE - A
   // It has been seen that if left sub-tree is perfect and right is
   // complete and there height is also same then sub-tree root
   // is also complete binary sub-tree with size equal to
   // sum of left and right subtrees plus one for current root
   if (lv1.isPerfect == true && rv1.isComplete == true && getHeight(lv1.size1) == getHeight(rv1.size1)) {
      rt1.isComplete = true;
      // It has been seen that if right sub-tree is perfect then
      // root is also perfect
      rt1.isPerfect = (rv1.isPerfect ? true : false);
      rt1.size1 = lv1.size1 + rv1.size1 + 1;
      rt1.rootTree = root;
      return rt1;
   }
   // CASE - B
   // It has been seen if left sub-tree is complete and right is
   // also perfect and the left height is greater than height of right by one
   // then sub-tree root will be a complete binary sub-tree with the size equal to
   // sum of left and right subtrees plus one for current root.
   // But sub-tree cannot be perfect binary sub-tree.
   if (lv1.isComplete == true && rv1.isPerfect == true && getHeight(lv1.size1) == getHeight(rv1.size1) + 1) {
      rt1.isComplete = true;
      rt1.isPerfect = false;
      rt1.size1 = lv1.size1 + rv1.size1 + 1;
      rt1.rootTree = root;
      return rt1;
   }
   // CASE - C
   // Otherwise this sub-tree cannot be a complete binary tree
   // and simply return the biggest sized complete sub-tree
   // found till now in the left or right sub-trees
   rt1.isPerfect = false;
   rt1.isComplete = false;
   rt1.size1 = max(lv1.size1, rv1.size1);
   rt1.rootTree = (lv1.size1 > rv1.size1 ? lv1.rootTree :
   rv1.rootTree);
   return rt1;
}
// Shows function to print the inorder traversal of the tree
void inorderPrint(node1* root){
   if (root != NULL) {
      inorderPrint(root->left);
      cout << root->data << " ";
      inorderPrint(root->right);
   }
}
// Driver code
int main(){
   // Creating the tree
   struct node1* root = newNode(50);
   root->left = newNode(30);
   root->right = newNode(60);
   root->left->left = newNode(5);
   root->left->right = newNode(20);
   root->right->left = newNode(45);
   root->right->right = newNode(70);
   root->right->left->left = newNode(10);
   // Getting the biggest sized complete binary sub-tree
   struct returnType ans1 = findCompleteBinaryTree(root);
   cout << "Size : " << ans1.size1 << endl;
   // Printing the inorder traversal of the found sub-tree
   cout << "Inorder Traversal : ";
   inorderPrint(ans1.rootTree);
   return 0;
}

আউটপুট

Size : 4
Inorder Traversal : 10 45 60 70

  1. C++ এ বাইনারি ট্রিতে রুট থেকে প্রদত্ত নোডের দূরত্ব খুঁজুন

  2. C++ এ প্রদত্ত নিখুঁত বাইনারি গাছের সমস্ত নোডের সমষ্টি খুঁজুন

  3. পাইথনে একটি প্রদত্ত বাইনারি ট্রিতে বৃহত্তম সম্পূর্ণ সাবট্রি খুঁজুন

  4. পাইথনে একটি প্রদত্ত বাইনারি ট্রিতে সবচেয়ে বড় পারফেক্ট সাবট্রি খুঁজুন