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

C++ में ट्री नोड्स डिलीट करें


मान लीजिए हमारे पास एक ट्री है, यह ट्री नोड 0 पर रूटेड है, यह निम्नानुसार दिया गया है -

  1. नोड्स की संख्या nodes है
  2. i-वें नोड का मान value[i] है
  3. i-वें नोड का पैरेंट parent[i] है

हमें हर उस सबट्री को हटाना है जिसके नोड्स के मानों का योग 0 है, ऐसा करने के बाद ट्री में शेष नोड्स की संख्या लौटाएं। यदि ट्री इस प्रकार है -

C++ में ट्री नोड्स डिलीट करें

7 नोड्स हैं, आउटपुट 2 होगा।

इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे -

  • children नामक एक मैप बनाएं
  • dfs() नामक एक मेथड परिभाषित करें, जो नोड, एक ऐरे value और ग्राफ लेगा
  • temp := एक पेयर (value[node], 1)
  • i के लिए 0 से graph[node] के आकार तक की रेंज में
    • temp2 := dfs(graph[node, i], value, graph)
    • फर्स्ट को temp2 के फर्स्ट से बढ़ाएं, सेकंड को temp2 के सेकंड से बढ़ाएं
  • यदि temp का फर्स्ट 0 है, तो ans := ans - temp का सेकंड, temp का सेकंड := 0 सेट करें
  • temp लौटाएं
  • मेन मेथड से, यह nodes, पैरेंट्स ऐरे और वैल्यूज़ ऐरे लेगा
  • n := वैल्यूज़ ऐरे में मौजूद वैल्यूज़ की संख्या
  • ans := n
  • ग्राफ नामक n + 1 आकार का एक ऐरे परिभाषित करें
  • i के लिए 1 से n - 1 तक की रेंज में
    • i को graph[parent[i]] में डालें
  • dfs(0, value, graph)
  • ans लौटाएं

उदाहरण (C++)

बेहतर समझ के लिए निम्नलिखित इम्प्लीमेंटेशन देखें -

#include <bits/stdc++.h> using namespace std; class Solution { public:    map <int, int> children;    int ans;    pair <int, int> dfs(int node, vector<int>& value, vector <int> graph[]){       pair <int, int> temp = {value[node], 1};       for(int i = 0; i < graph[node].size(); i++){          pair <int, int> temp2 = dfs(graph[node][i], value, graph);          temp.first += temp2.first;          temp.second += temp2.second;       }       if(temp.first == 0){          ans -= temp.second;          temp.second = 0;       }       return temp;    }    int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) {       int n = value.size();       ans = n;       children.clear();       vector < int > graph[n + 1];       for(int i = 1; i < n; i++){          graph[parent[i]].push_back(i);       }       dfs(0, value, graph);       return ans;    } }; main(){    vector<int> v1 = {-1,0,0,1,2,2,2};    vector<int> v2 = {1,-2,4,0,-2,-1,-1};    Solution ob;    cout << (ob.deleteTreeNodes(7,v1, v2)); }

इनपुट

7 [-1,0,0,1,2,2,2] [1,-2,4,0,-2,-1,-1]

आउटपुट

2

  1. C++ में बाइनरी ट्री नोड्स को वैलिडेट करना C++ में बाइनरी ट्री नोड्स को वैलिडेट करना

    मान लीजिए हमारे पास 0 से n-1 तक नंबरेड n बाइनरी ट्री नोड्स हैं जहां नोड i के दो चिल्ड्रन leftChild[i] और rightChild[i] हैं, हमें true कहना है यदि और केवल यदि सभी दिए गए नोड्स ठीक एक वैलिड बाइनरी ट्री बनाते हैं। जब नोड i का कोई लेफ्ट चाइल्ड नहीं होता तो leftChild[i] -1 के बराबर होगा, इसी तरह राइट चा

  1. C++ में ट्री डायमीटर C++ में ट्री डायमीटर

    मान लीजिए हमारे पास एक अनडायरेक्टेड ट्री है; हमें इसका डायमीटर ढूंढना है - उस ट्री में सबसे लंबे पथ में एज की संख्या उस ट्री का डायमीटर है। यहां ट्री को एज लिस्ट के रूप में दिया गया है जहां edges[i] = [u, v] नोड्स u और v के बीच एक बायडायरेक्शनल एज है। प्रत्येक नोड के लेबल सेट {0, 1, ..., edges.lengt

  1. C++ में पूर्ण बाइनरी ट्री के नोड्स गिनें C++ में पूर्ण बाइनरी ट्री के नोड्स गिनें

    मान लीजिए हमारे पास एक पूर्ण बाइनरी ट्री है, हमें नोड्स की संख्या गिननी है। तो यदि ट्री इस तरह है −तो आउटपुट 6 होगा।इसे हल करने के लिए, हम इन चरणों का पालन करेंगेयह रिकर्सिव दृष्टिकोण का उपयोग करेगा। यह मेथड, countNodes() रूट को आर्गुमेंट के रूप में ले रहा है।hr := 0 और hl := 0दो नोड्स l और r