Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

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++ में दिए गए परफेक्ट बाइनरी ट्री के सभी नोड्स का योग ज्ञात करें

    मान लीजिए कि हमारे पास एक सकारात्मक पूर्णांक L है, जो एक पूर्ण बाइनरी ट्री में स्तरों की संख्या का प्रतिनिधित्व करता है। इस परफेक्ट बाइनरी ट्री में लीफ नोड्स की संख्या 1 से n तक होती है। जहां n लीफ नोड्स की संख्या है। पैरेंट नोड बच्चों का योग है। हमारा काम इस परफेक्ट बाइनरी ट्री के सभी नोड्स के योग

  1. पायथन में दिए गए बाइनरी ट्री में सबसे बड़ा पूर्ण उपट्री खोजें

    मान लीजिए हमारे पास एक बाइनरी ट्री है; हमें इस बाइनरी ट्री में अधिकतम पूर्ण उप-वृक्ष का आकार खोजना होगा। जैसा कि हम जानते हैं कि एक पूर्ण बाइनरी ट्री एक बाइनरी ट्री है यदि सभी स्तर पूरी तरह से बिना संभावित अंतिम स्तर के भरे हुए हैं और अंतिम स्तर में यथासंभव सभी कुंजियाँ हैं। तो, अगर इनपुट पसंद है

  1. पायथन में दिए गए बाइनरी ट्री में सबसे बड़ा परफेक्ट सबट्री खोजें

    मान लीजिए कि हमारे पास एक दिया गया बाइनरी ट्री है; हमें दिए गए बाइनरी ट्री में सबसे बड़े परफेक्ट उप-वृक्ष का आकार ज्ञात करना है। जैसा कि हम जानते हैं कि पूर्ण बाइनरी ट्री एक बाइनरी ट्री है जिसमें सभी आंतरिक नोड्स में दो बच्चे होते हैं और सभी पत्ते समान स्तर पर होते हैं। तो, अगर इनपुट पसंद है तो