लगभग हर परियोजना जिसमें कुछ संपादन योग्य मॉडल या दस्तावेज़ होते हैं, उसके पास एक पदानुक्रमित संरचना होगी। विभिन्न संस्थाओं के लिए आधार-वर्ग के रूप में 'श्रेणीबद्ध नोड' को लागू करने के लिए यह काम आ सकता है। अक्सर लिंक्ड-लिस्ट (चाइल्ड सिबलिंग, 2 डी मॉडल) प्राकृतिक तरीका है जिससे कई क्लास लाइब्रेरीज़ विकसित होती हैं, हालाँकि बच्चे विविध प्रकार के हो सकते हैं, और शायद एक " ऑब्जेक्ट मॉडल " वह नहीं है जो हम सामान्य रूप से पेड़ों के बारे में बात करते समय मानते हैं।
आपके पहले मॉडल के एक पेड़ (नोड) का मेरा पसंदीदा कार्यान्वयन एक-लाइनर (सी # में) है:
public class node : List<node> { /* props go here */ }
अपने स्वयं के प्रकार की एक सामान्य सूची से विरासत (या किसी अन्य सामान्य संग्रह से विरासत में मिली-प्रकार)। चलना एक दिशा में संभव है: जड़ को नीचे की ओर बनाएं (आइटम अपने माता-पिता को नहीं जानते)।
माता-पिता केवल पेड़
एक और मॉडल जिसका आपने उल्लेख नहीं किया है, वह वह जगह है जहां हर बच्चे के माता-पिता का संदर्भ होता है:
null
|
+---------+---------------------------------+
| parent |
| root |
+-------------------------------------------+
| | |
+---------+------+ +-------+--------+ +--+-------------+
| parent | | parent | | parent |
| node 1 | | node 2 | | node 3 |
+----------------+ +----------------+ +----------------+
इस पेड़ को घूमना केवल दूसरे तरीके से संभव है, आम तौर पर इन सभी नोड्स को संग्रह (सरणी, हैशटेबल, शब्दकोश आदि) में संग्रहीत किया जाएगा और एक नोड को श्रेणीबद्ध स्थान के अलावा अन्य मानदंडों पर संग्रह की खोज करके स्थित किया जाएगा। वृक्ष जो आमतौर पर प्राथमिक महत्व का नहीं होगा।
ये पैरेंट-ओनली ट्री आमतौर पर डेटाबेस एप्लिकेशन में देखे जाते हैं। "Select * WHERE ParentId = x" कथनों वाले नोड के बच्चों को खोजना काफी आसान है। हालाँकि, हम शायद ही कभी पेड़ के नोड क्लास ऑब्जेक्ट में इस तरह से तब्दील हो पाते हैं। Statefull (डेस्कटॉप) अनुप्रयोगों में उन्हें मौजूदा ट्री-नोड नियंत्रण में लपेटा जा सकता है। स्टेटलेस (वेब) अनुप्रयोगों में भी, जिसकी संभावना नहीं है। मैंने देखा है कि ORM- मैपिंग क्लास-जेनरेटर टूल स्टैक ओवरफ्लो एरर फेंकते हैं, जब उन तालिकाओं के लिए क्लासेस बनाते हैं जो खुद के साथ संबंध रखते हैं (चकली), तो शायद ये पेड़ उस तरह के आम नहीं हैं।
द्विदिश नौगम्य पेड़
हालांकि अधिकांश व्यावहारिक मामलों में, दोनों दुनिया में सबसे अच्छा होना सुविधाजनक है। नोड्स जिनमें बच्चों की एक सूची है और इसके अलावा उनके माता-पिता को जानते हैं: द्विदिश नाविक पेड़।
null
|
+--------------------+--------------------+
| parent |
| root |
| child1 child2 child3 |
+--+------------------+----------------+--+
| | |
+---------+-----+ +-------+-------+ +---+-----------+
| parent | | parent | | parent |
| node1 | | node2 | | node3 |
| child1 child2 | | child1 child2 | | child1 child2 |
+--+---------+--+ +--+---------+--+ +--+---------+--+
| | | | | |
यह कई और पहलुओं पर विचार करता है:
- माता-पिता के लिंकिंग और अनलिंकिंग को लागू करने के लिए कहां?
- बूसी लॉजिक का ध्यान रखें, और नोड से बाहर के पहलू को छोड़ दें (वे भूल जाएँगे!)
- नोड्स में बच्चे पैदा करने के तरीके हैं (पुन: आदेश देने की अनुमति नहीं है) (उनके System.Xml.XmlDocument DOM कार्यान्वयन में माइक्रोसाफ्ट विकल्प, जो मुझे पहली बार सामना करने पर पागल कर देता है)
- नोड्स अपने निर्माता में एक अभिभावक लेते हैं (पुन: आदेश देने की अनुमति नहीं देते हैं)
- सभी ऐड () में, सम्मिलित करें () और निकालें () तरीके और नोड्स के उनके अधिभार (आमतौर पर मेरी पसंद)
- हठ
- जब चलना है तो पेड़ कैसे चलें (उदाहरण के लिए माता-पिता को छोड़ें)
- डी-सीरियलाइज़ करने के बाद दो-तरफ़ा लिंक को फिर से कैसे बनाया जाए (सभी अभिभावकों को फिर से डिसेरिएलाइज़ेशन एक्शन के रूप में स्थापित किया जाए)
- सूचनाएं
- स्थिर तंत्र (IsDirty ध्वज), गुणों में पुनरावर्ती संभाल?
- घटनाएँ, माता-पिता के माध्यम से बच्चों के माध्यम से, या दोनों तरीकों से बबल अप करें (उदाहरण के लिए विंडोज़ संदेश पंप पर विचार करें)।
अब इस सवाल का जवाब देने के लिए , द्विदिश नौवहन योग्य पेड़ (मेरे करियर और क्षेत्र में अब तक) सबसे व्यापक रूप से उपयोग किए जाते हैं। उदाहरण हैं। System। Windows.orms.Control या .Net फ्रेमवर्क में System.Web.UI.Crol के माइक्रोप्रोसेस कार्यान्वयन, लेकिन साथ ही प्रत्येक DOM (डॉक्यूमेंट ऑब्जेक्ट मॉडल) कार्यान्वयन में नोड्स होंगे जो अपने माता-पिता के साथ-साथ अभिज्ञान को जानते हैं। उनके बच्चों की। कारण: कार्यान्वयन में आसानी पर उपयोग में आसानी। इसके अलावा, ये आम तौर पर अधिक विशिष्ट वर्गों के लिए आधार वर्ग होते हैं (XmlNode टैग, विशेषता और पाठ वर्गों का आधार हो सकता है) और ये आधार कक्षाएं सामान्य क्रमबद्धता और घटना से निपटने वाले आर्किटेक्चर लगाने के लिए प्राकृतिक स्थान हैं।
कई आर्किटेक्चर के दिल में ट्री की परत है, और स्वतंत्र रूप से नेविगेट करने में सक्षम होने का मतलब है तेजी से समाधान को लागू करना।