सी ++ में पेड़ कैसे बनाएं?


6

मैं सी ++ में पेड़ डेटा संरचना कैसे बना सकता हूं जो पॉइंटर्स के बजाय इटरेटर का उपयोग करता है? मुझे एसटीएल में कुछ भी नहीं मिला जो यह कर सकता है। मुझे क्या करना चाहते हैं इस तरह बना सकते हैं और पेड़ हेरफेर करने के लिए सक्षम होने के लिए है:

#include <iostream> 
#include <tree> 
using namespace std; 

int main() 
{ 
    tree<int> myTree; 

    tree<int>::iterator i = myTree.root(); 
    *i = 42; 

    tree<int>::iterator j = i.add_child(); 
    *j = 777; 
    j = j.parent(); 

    if (i == myTree.root() && i == j) cout << "i and j are both pointing to the root\n"; 

    return 0; 
} 

धन्यवाद, tree.hh बस जैसे देख रहा था हो रहा है।

यदि यह मनमाना सूचकांक प्रकार पकड़े एक डेटा संरचना के लाभ पाने के लिए है, खोज के लिए अनुकूलित और सम्मिलन में अच्छा तो एक मानचित्र का उपयोग पर विचार करें। लघुगणक खोज, लघुगणक प्रविष्टि, लघुगणक विलोपन, रैखिक अंतरिक्ष:

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

मुझे यकीन नहीं है कि एक नक्शा मुझे चाहिए, लेकिन जानकारी के लिए धन्यवाद। पेड़ों को लागू करने के बजाय जब भी संभव हो, मुझे नक्शे का उपयोग करना याद रखना होगा।

5

यहां tree.hh है जो आप जो करना चाहते हैं उसके करीब थोड़ा सा है, हालांकि थोड़ा अलग है।

यहां अपनी वेबसाइट से निकाले गए कोड का एक टुकड़ा है।

int main(int, char **) 
    { 
    tree<string> tr; 
    tree<string>::iterator top, one, two, loc, banana; 

    top=tr.begin(); 
    one=tr.insert(top, "one"); 
    two=tr.append_child(one, "two"); 
    tr.append_child(two, "apple"); 
    banana=tr.append_child(two, "banana"); 
    tr.append_child(banana,"cherry"); 
    tr.append_child(two, "peach"); 
    tr.append_child(one,"three"); 

    loc=find(tr.begin(), tr.end(), "two"); 
    if(loc!=tr.end()) { 
     tree<string>::sibling_iterator sib=tr.begin(loc); 
     while(sib!=tr.end(loc)) { 
     cout << (*sib) << endl; 
     ++sib; 
     } 
     cout << endl; 
     tree<string>::iterator sib2=tr.begin(loc); 
     tree<string>::iterator end2=tr.end(loc); 
     while(sib2!=end2) { 
     for(int i=0; i<tr.depth(sib2)-2; ++i) 
      cout << " "; 
     cout << (*sib2) << endl; 
     ++sib2; 
     } 
     } 
    } 

अब क्या अलग है? जब की बात आती है तो आपका कार्यान्वयन आसान होता है जब पेड़ पर नोड लगाया जाता है। हालांकि आपका संस्करण अनिवार्य रूप से सरल है, लेकिन इस lib का देव शायद पेड़ को ब्राउज़ किए बिना कुछ जानकारी प्राप्त करना चाहता था, उदाहरण के लिए पेड़ के आकार के रूप में।

मुझे यह भी लगता है कि वह प्रदर्शन कारणों से सभी नोड्स पर रूट को स्टोर नहीं करना चाहता था। तो यदि आप इसे अपने तरीके से कार्यान्वित करना चाहते हैं, तो मेरा सुझाव है कि आप अधिकतर तर्क रखें और इसे इटरेटर में मूल पेड़ में लिंक जोड़ें और थोड़ा सा जोड़ दें।


3

क्यों आपको लगता है कि क्या करना चाहते हैं? यदि यह सीखने के उद्देश्यों के लिए है तो आप अपना पेड़ डेटा संरचना लिख ​​सकते हैं। यदि यह डेटा-स्ट्रक्चर के लाभ को प्राप्त करने के लिए है, जो मनमाने ढंग से इंडेक्स प्रकारों को पकड़ रहा है, खोज के लिए अनुकूलित और सम्मिलन में अच्छा है तो मानचित्र का उपयोग करने पर विचार करें।

एक नक्शा एक सहयोगी कंटेनर है जिसमें एक पेड़ के समान प्रदर्शन गारंटी होती है: लॉगरिदमिक खोज, लॉगरिदमिक सम्मिलन, लॉगरिदमिक विलोपन, रैखिक स्थान। आंतरिक रूप से उन्हें अक्सर लाल-काले पेड़ के रूप में लागू किया जाता है, हालांकि यह गारंटी नहीं है। फिर भी, एक एसटीएल उपयोगकर्ता के रूप में आपको एसटीएल एल्गोरिदम और डेटा-संरचनाओं की प्रदर्शन गारंटी की देखभाल करनी चाहिए। चाहे वे पेड़ या छोटे हरे रंग के पुरुषों के रूप में लागू हों, आपको कोई फर्क नहीं पड़ता।

एक साइड नोट के रूप में, रूट() फ़ंक्शन जैसी कोई चीज़ नहीं है। सभी एसटीएल कंटेनर में कंटेनर की वैचारिक शुरुआत को लागू करने वाला प्रारंभ() फ़ंक्शन होता है। उस समारोह द्वारा लौटाया गया इटेटरेटर कंटेनर की विशेषताओं पर निर्भर करता है।