राइट एक बाइनरी ट्री थ्रेडिंग

वोट
0

मैं इस एक पता लगाने की कोशिश एक समय की एक नरक हो रही है। हर जगह मैं देखो, मैं केवल गैर-पुनरावर्ती (भाग मैं वास्तव में समझ में) कैसे वास्तव में सूची के माध्यम से पार करने के लिए पर स्पष्टीकरण में चल कर रहे हैं। वहाँ किसी को भी कैसे वास्तव में मैं इस सूची के माध्यम से शुरू में जा सकते हैं में हथौड़ा और वास्तविक पूर्ववर्ती / उत्तराधिकारी नोड वर्ग में झंडा उन्हें नोड तो मैं कर सकते हैं मिल सकता है? मैं एक साधारण बाइनरी खोजें ट्री बना सकते हैं और सूची के माध्यम से जाने के लिए और पूर्ववर्ती / उत्तराधिकारी को अशक्त लिंक मार्ग बदलने के लिए सक्षम होना चाहिए। मैं कुछ हद तक निम्नलिखित की तरह एक समाधान के साथ कुछ भाग्यशाली रहे हैं:

thread(node n, node p) {
     if (n.left !=null)
        thread (n.left, n);
     if (n.right !=null) {
        thread (n.right, p);
     }
     n.right = p;
}
29/07/2009 को 19:11
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
1

अपने विवरण से, मैं मान लेंगे आप एक संरचना की तरह कुछ के लिए देख के साथ एक नोड है:

Node {
  left
  right
}

... और आप इन छोड़ दिया और सही का उपयोग करके सेट के एक द्विआधारी पेड़ है, और आप फिर से सौंप करने के लिए मूल्यों को छोड़ दिया और सही इस तरह है कि यह की गहराई पहले ट्रेवर्सल से एक doublely लिंक्ड-सूची बनाता चाहते हैं कि कि पेड़।

हमेशा यह - जड़ क्या आप अब तक मिल गया है के साथ (कोई यमक इरादा) समस्या यह है कि "नोड पी" (? पिछले का संक्षिप्त रूप) कि ट्रेवर्सल दौरान पारित हो जाता है, जहां पेड़ में आप वर्तमान में कर रहे हैं के स्वतंत्र होने की जरूरत है है पहले देखी नोड को रोकने के लिए की जरूरत है। ऐसा करने के लिए, हर बार धागा यह संदर्भित करने के लिए एक ही "पिछला" चर की जरूरत चलाया जाता है। मैं एक सी-वाद के साथ कुछ अजगर-इश छद्म कोड किया है - अगर आप परिचित नहीं हैं, ' और ' का अर्थ है "संदर्भ के लिए" (या "रेफरी" सी # में), और '*' का अर्थ है "भिन्नता और मुझे दे वस्तु इसे करने के लिए "की ओर इशारा करते है।

Node lastVisited
thread(root, &lastVisisted)

function thread(node, lastVisitedRef)
  if (node.left)
    thread(node.left, lastVisitedRef)
  if (node.right)
    thread(node.right, lastVisitedRef)

  // visit this node, reassigning left and right
  if (*lastVisitedRef)
    node.right = *lastVisitedRef
    (*lastVisitedRef).left = node
  // update reference lastVisited
  lastVisitedRef = &node

आप सी में इस लागू करने के लिए जा रहे थे, तो आप वास्तव संदर्भ धारण करने के लिए एक डबल सूचक आवश्यकता होगी, लेकिन यह विचार एक ही है - आप पूरे ट्रेवर्सल के दौरान "पिछली बार देखे नोड" के स्थान जारी रहती है की जरूरत है।

31/07/2009 को 05:36
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more