2016-04-03 15 views
5

मैं जूलिया में बीएसटी को लागू करने की कोशिश कर रहा हूं, लेकिन जब मैं सम्मिलित समारोह को कॉल करता हूं तो मुझे समस्या का सामना करना पड़ा। जब मैं नया नोड बनाने की कोशिश करता हूं, तो संरचना अपरिवर्तित रहता है।जूलिया में बीएसटी को कैसे कार्यान्वित करें?

मेरे कोड:

type Node 
    key::Int64 
    left 
    right 
end 

function insert(key::Int64, node) 
    if node == 0 
     node = Node(key, 0, 0) 
    elseif key < node.key 
     insert(key, node.left) 
    elseif key > node.key 
     insert(key, node.right) 
    end 
end 

root = Node(0,0,0) 
insert(1,root) 
insert(2,root) 

मैं भी कुछ भी नहीं करने के लिए शून्य बदलने की कोशिश की। अगला संस्करण जो मैंने कोशिश की वह नोड में परिभाषित डेटाटाइप के साथ है, लेकिन जब मैं कुछ भी मूल्य (सी नल के समान) के साथ सम्मिलित करने का प्रयास करता हूं तो उसने मुझे त्रुटि दी।

उत्तर के लिए धन्यवाद।

+0

सुनिश्चित नहीं है कि मैं प्रश्न समझता हूं - आप 'डालने' समारोह को वास्तव में क्या करने की अपेक्षा करते हैं? अंतिम कोड के लिए दूसरे कोड के लिए 'नोड (1,0,0) 'और पिछले पंक्ति के लिए' नोड (2,0,0)', जो सही लगता है, चल रहा है? –

+0

मुझे यकीन नहीं है कि बीएसटी क्या है, लेकिन अपना कोड पढ़ना वह है जो आप एक ऐसा कार्य लिखने की कोशिश कर रहे हैं जो 'नोड' इनपुट (फ़ील्ड्स 'की',' बाएं 'और' दाएं 'के साथ) और एक 'कुंजी ', और फिर दो चीजों में से एक है: (i) यदि' नोड 'परिभाषित नहीं किया गया है, तो' कुंजी 'तर्क के साथ' कुंजी 'तर्क के साथ एक नया' नोड 'उदाहरण बनाएं और' बाएं 'के लिए शून्य और' दाएं 'या (ii) यदि 'नोड' मौजूद है, तो कार्य के' कुंजी' तर्क के साथ 'बाएं' या 'दाएं' फ़ील्ड को अपडेट करें? –

+0

बीएसटी बाइनरी सर्च ट्री के लिए खड़ा है। फ़ंक्शन संरचना के लिए नए नोड्स डालता है। शून्य कुछ भी नहीं है। – pavelf

उत्तर

14

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

मुझे लगता है कि निम्नलिखित काम करना चाहिए:

type BST 
    key::Int 
    left::Nullable{BST} 
    right::Nullable{BST} 
end 

BST(key::Int) = BST(key, Nullable{BST}(), Nullable{BST}()) 
BST() = BST(0) 

function Base.push!(node::BST, key) 
    if key < node.key 
     if node.left.isnull 
      node.left = BST(key) 
     else 
      push!(node.left.value, key) 
     end 
    elseif key > node.key 
     if node.right.isnull 
      node.right = BST(key) 
     else 
      push!(node.right.value, key) 
     end 
    end 
end 

root = BST() 
push!(root, 1) 
push!(root, 2) 

इस संस्करण overloads जूलिया धक्का! फ़ंक्शन, और Nullable प्रकार का उपयोग करता है ताकि वह एक पत्ता नोड के बीच अंतर कर सके और जहां यह खोजना जारी रखने की आवश्यकता है कि कुंजी कहां डालें। यह एक पुनरावर्ती परिभाषा है, और अनुकूलित नहीं है, यह रिकर्सिव के बजाय लूप के साथ ऐसा करने के लिए बहुत तेज़ होगा।

संबंधित मुद्दे