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

C++ में ट्री में सबट्री के DFS के लिए क्वेरीज़


इस समस्या में हमें एक बाइनरी ट्री दिया गया है और हमें एक विशेष नोड से DFS करना है जिसमें हम दिए गए नोड को रूट मानते हैं और उससे DFS करते हैं।

C++ में ट्री में सबट्री के DFS के लिए क्वेरीज़

उपरोक्त ट्री में मान लें हमें नोड F से DFS करना है

इस ट्यूटोरियल में हम कुछ अपरंपरागत तरीके लागू करने जा रहे हैं ताकि हमारी समय जटिलता काफी कम हो जाए और इस प्रकार हम इस कोड को उच्च प्रतिबंधों के लिए भी चला सकें।

दृष्टिकोण - इस दृष्टिकोण में हम केवल सरल तरीके से नहीं जाने वाले हैं यानी जहां हम केवल हर नोड के लिए DFS लागू करते हैं क्योंकि यह उच्च प्रतिबंधों के लिए काम नहीं करेगा इसलिए हम TLE से बचने के लिए कुछ अपरंपरागत तरीकों का उपयोग करने की कोशिश करते हैं।

 #include <bits/stdc++.h> using namespace std; #define N 100000 // ट्री नोड्स कनेक्शन स्टोर करने के लिए एडजेसेंसी लिस्ट vector<int> v[N]; unordered_map<int, int> mape; // नोड को उसके इंडेक्स के साथ जोड़ने के लिए उपयोग किया जाएगा vector<int> a; void dfs(int nodesunder[], int child, int parent){ // DFS के लिए फंक्शन और     प्रीकैलकुलेशन हमारे nodesunder     a.push_back(child); // हमारे ट्री का DFS स्टोर करना     // चाइल्ड सबट्री के nodesunder     nodesunder[child] = 1;     for (auto it : v[child]) { // सामान्य DFS करना         if (it != parent) { // चूंकि चाइल्ड अपने पैरेंट तक चढ़ सकता है         // इसलिए हम उससे बचने की कोशिश कर रहे हैं क्योंकि यह एक चक्र बन जाएगा             dfs(nodesunder, it, child); // रिकर्सिव कॉल             nodesunder[child] += nodesunder[it]; // nodesunder को बढ़ाना         // इसके बच्चों के नीचे मौजूद नोड्स की संख्या से         }     } } // सबट्री के DFS को प्रिंट करने का फंक्शन void printDFS(int node, int nodesunder[]){     int ind = mape[node]; // DFS सरणी में हमारे नोड का इंडेक्स     cout << "The DFS of subtree " << node << ": ";     // सबट्री का DFS प्रिंट करना     for (int i = ind; i < ind + nodesunder[node]; i++){ // DFS सरणी के माध्यम से जाना और फिर     // हमारे दिए गए नोड के तहत सभी नोड्स प्रिंट करना         cout << a[i] << " ";     }     cout << endl; } void addEdgetoGraph(int x, int y){ // एडजेसेंसी लिस्ट बनाए रखने के लिए     v[x].push_back(y);     v[y].push_back(x); } void mark(){ // DFS सरणी में प्रत्येक नोड को उसके इंडेक्स के साथ चिह्नित करना     int size = a.size();     // इंडेक्स चिह्नित करना     for (int i = 0; i < size; i++) {        mape[a[i]] = i;     } } int main(){     int n = 7;     // ट्री के एज जोड़ना     addEdgetoGraph(1, 2);     addEdgetoGraph(1, 3);     addEdgetoGraph(2, 4);     addEdgetoGraph(2, 5);     addEdgetoGraph(4, 6);     addEdgetoGraph(4, 7);     // हर नोड के सबट्री में मौजूद नोड्स स्टोर करने के लिए सरणी     int nodesunder[n + 1];     dfs(nodesunder, 1, 0); // हमारा nodesunder सरणी जनरेट करना     mark(); // मैप में इंडेक्स चिह्नित करना     // क्वेरी 1     printDFS(2, nodesunder);     // क्वेरी 2     printDFS(4, nodesunder);     return 0; }

आउटपुट

The DFS of subtree 2: 2 4 6 7 5 The DFS of subtree 4: 4 6 7

कोड को समझना

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

निष्कर्ष

इस ट्यूटोरियल में, हम एक ट्री में सबट्री के DFS के लिए क्वेरीज़ की समस्या को हल करते हैं। हमने इस समस्या के लिए C++ प्रोग्राम और पूरा दृष्टिकोण (सामान्य) भी सीखा जिससे हमने इस समस्या को हल किया।

हम यही प्रोग्राम C, Java, Python और अन्य भाषाओं में भी लिख सकते हैं। आशा है आपको यह लेख उपयोगी लगा होगा।

  1. C++ में उल्टे उपट्री (Inverted Subtree) की जांच C++ में उल्टे उपट्री (Inverted Subtree) की जांच

    दो बाइनरी ट्री source और target दिए गए हैं। जांचें कि क्या source का कोई उल्टा रूप (inversion) target का उपट्री है। उल्टा रूप का अर्थ: बाएं और दाएं बच्चे वैकल्पिक रूप से स्वैप हो सकते हैं। रिकर्सिव जांच: दो ट्री उल्टे हैं यदि (बाएं-बाएं और दाएं-दाएं मेल खाते हैं) या (बाएं-दाएं और दाएं-बाएं मेल खाते

  1. C++ में बाइनरी ट्री प्रिंट करना C++ में बाइनरी ट्री प्रिंट करना

    मान लीजिए हमें एक बाइनरी ट्री को m×n 2D स्ट्रिंग सरणी में इन नियमों के आधार पर प्रदर्शित करना है: पंक्ति संख्या m दी गई बाइनरी ट्री की ऊंचाई के समान होनी चाहिए। स्तंभ संख्या n हमेशा एक विषम संख्या होनी चाहिए। रूट नोड का मान पहली पंक्ति के ठीक बीच में रखा जाना चाहिए जहां इसे रखा जा सकता है। वह स्तं

  1. C++ में जांचें कि बाइनरी ट्री किसी अन्य बाइनरी ट्री का सबट्री है या नहीं C++ में जांचें कि बाइनरी ट्री किसी अन्य बाइनरी ट्री का सबट्री है या नहीं

    मान लीजिए हमारे पास दो बाइनरी ट्री हैं। हमें जांचना है कि छोटा ट्री दूसरे बाइनरी ट्री का सबट्री है या नहीं। मान लीजिए ये दो ट्री दिए गए हैं।दो ट्री हैं। दूसरा ट्री पहले का सबट्री है। इस गुण की जांच करने के लिए, हम ट्री को पोस्ट-ऑर्डर फैशन में ट्रैवर्स करेंगे, फिर यदि इस नोड से रूटेड सबट्री दूसरे ट्र