2011-10-09 8 views
7

मेरे पास एक बीएसटी है जिसमें डुप्लिकेट प्रविष्टियां हैं। मैं डुप्लिकेट प्रविष्टियों को खोजने की कोशिश कर रहा हूं। अब जाहिर है कि मैं एक गूंगा एल्गोरिदम लिख सकता हूं जो पूरे पेड़ को पार करता है, जो आसान है।बाइनरी खोज पेड़ में डुप्लिकेट प्रविष्टियों को खोजने की रणनीति

हालांकि, मैं एक और अधिक कुशल लिखना चाहता हूं। यहां मैंने जो किया है/मैंने अभी तक सोचा है:

निम्न पेड़ मानें।

 10 
    / \ 
    5 15 
    /\ /\ 
    2 8 10 16 
     \ \ 
     8 12 

अगर मैं अगर यह कोई अधिकार नहीं बच्चा है डुप्लिकेट खोजने के लिए, सभी 8 की, मैं पहले से 10 के बाईं सबट्री पर 8 मिलेगा खोजना चाहते हैं, यह होने जा रहा है सबसे बाईं ओर उस नोड (8) से बड़े पहले माता-पिता के दाएं-उप-भाग पर नोड? और अगर उसके पास सही बच्चा होता है, तो यह या तो अपने दाएं उपट्री के बाएं सबसे नोड में या बाएं उपट्री पर सबसे अधिक नोड सही हो सकता है?

क्या वे सभी मामले हैं, जिन्हें लूप और if-statement के समूह के साथ हासिल किया जा सकता है?

यदि नहीं, तो बेहतर दृष्टिकोण क्या है? क्या कोई मदद कर सकता है?

धन्यवाद

संपादित करें: असल में मैं सिर्फ महसूस किया कि यह "सबसे नोड छोड़ दिया" या "सही सबसे नोड" नहीं हो सकता। वह नोड पाएगा जो अगले उच्चतम मूल्य या पिछले सबसे कम मूल्य है। क्या यह पहले एक नोड होगा?

संपादित करें 2:

फिक्स्ड मेरी BST उदाहरण। यह निम्न प्रविष्टि विधि इस प्रकार है:

if (node == null) 
    return new NodeBST<Value>(name, value); 

if (node.key().compareTo(name) > 0) 
    node.setLeft(insert(node.left(), name, value));  
else 
    node.setRight(insert(node.right(), name, value)); 

इसका मतलब यह है डुप्लिकेट उनके डुप्लिकेट के अधिकार के लिए जोड़ दिया जाएगा .. है ना?

+0

तुम्हें पता है पहले से क्या नंबर आप के लिए देख रहे हैं की एक सरणी वापसी? – lynks

+0

क्या यह बीएसटी के उद्देश्य को हराने में नहीं आता है? – Jasoneer

+1

यह उचित बीएसटी नहीं है। आपके पास रूट 10 की दाहिनी शाखा पर 8 नहीं हो सकते हैं। –

उत्तर

2
  1. एक तत्व है कि हमेशा की तरह द्विआधारी पेड़ खोज कलन विधि का उपयोग अपने प्रमुख से मेल खाता है का पता लगाएं। यदि नहीं मिला, तो रुको।
  2. एलएच उप-शाखा की जांच करें। यदि इसके प्रमुख मैच हैं, तो वर्तमान नोड बनाएं और इस चरण को दोहराएं।
  3. अब आप उस कुंजी के साथ पेड़ में पहले तत्व पर हैं। अब चाबियाँ बराबर होती हैं, जबकि चाबियाँ बराबर होती हैं, यानी पाठक के लिए अभ्यास के रूप में छोड़े गए इस नोड, सही उप-पेड़, माता-पिता, माता-पिता का दायां उप-पेड़ आदि।
+0

मुझे विश्वास है कि चरण 2 में यह मेरे सम्मिलन के अनुसार आरएच उप-शाखा होना चाहिए (जैसा उपरोक्त संपादन 2 में दिखाया गया है), डुप्लिकेट नोड के दाहिने बच्चे को डाला जाता है। सही बात? – darksky

+0

@Nayefc पहली बार जब आप (2) प्राप्त करते हैं तो यह नहीं पता कि सभी डुप्लिकेट केवल दाईं ओर हैं। यह इस बात पर निर्भर करता है कि आप अपना खोज कोड कैसे लिखते हैं। – EJP

+0

ओह हाँ मुझे पता है कि। मैं बस इतना कह रहा हूं कि मेरी प्रविष्टि विधि नोड के दाईं ओर डुप्लीकेट रखती है। (कृपया उपरोक्त कोड + आरेख देखें)। तो यह चरण 2 को इस प्रकार नहीं बनायेगा: एलएच उप-शाखा के बजाय 'आरएच उप-ब्रांसी की जांच करें'? – darksky

2

जो पेड़ आप दिखाते हैं वह पेड़ (अच्छी तरह से, कम से कम मुझे लगता है ... ;-)) जो बाईं ओर से कम है, और दाएं से अधिक हैं, क्या मैं सही हूँ?

तो दो चीजें आप विचार करना चाहिए:

  1. आपका पेड़ गलत है! "10" सिर के दाईं ओर दूसरा "8" वहां नहीं हो सकता है, क्योंकि यह 10 से कम है। एक सही सम्मिलन, और एक सही संतुलन, दोनों "बहुत" पुनरावृत्ति पर सही नहीं होने पर बहुत करीबी हो जाएंगे "बाएं 8" से।

  2. पेड़ को बाईं ओर "कम से कम या बराबर" के रूप में परिभाषित करके, और दाईं ओर "अधिक से अधिक", आपको वांछित परिणाम मिल जाएगा: सभी "8" को जंजीर कर दिया जाएगा एक साधारण प्रविष्टि पेड़ पर एक दूसरे के बाएं।

+0

हां हाँ मैं अपनी गलती के लिए क्षमा चाहता हूं। कृपया संपादन 2 देखें। मेरा सम्मिलन उन्हें एक-दूसरे के दाईं ओर चेन करता है। तो जब मुझे डुप्लिकेट मिल जाए, तो बस अपने सही बच्चे/बच्चों को सभी डुप्लिकेट देखने के लिए जाएं? – darksky

+0

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

0

एक रिकर्सिव एल्गोरिदम इसे जल्दी से हल कर सकता है। आपको पूरे पेड़ पर भर्ती करने की ज़रूरत नहीं है, क्योंकि आप अपनी जरूरतों को कम करने के लिए बीएसटी की संरचना का उपयोग कर सकते हैं।

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

+0

मुझे खेद है, मुझे पता है कि। मैंने गलती की है कृपया संशोधित संपादन 2 देखें। धन्यवाद – darksky

0

इस कार्यान्वयन पुनरावर्ती विधि का उपयोग करता है और डुप्लिकेट प्रविष्टियों

public class TreeNode<E> { 
    public int data; 
    public TreeNode left; 
    public TreeNode right; 
} 

public Integer[] findDuplicate(TreeNode tree) { 
    Map<Integer, Integer> entries = new HashMap<>(); 
    List<Integer> duplicates = new LinkedList<>(); 

    return (Integer[]) findDuplicate(tree, entries, duplicates); 
} 

private Integer[] findDuplicate(TreeNode tree, Map entries, List duplicates) { 
    if (tree == null) 
     return (Integer[]) duplicates.toArray(new Integer[] {}); 

    if (entries.containsKey(tree.data)) 
     duplicates.add(tree.data); 
    else 
     entries.put((int) tree.data, 1); 

    findDuplicate(tree.left, entries, duplicates); 
    findDuplicate(tree.right, entries, duplicates); 

    return (Integer[]) duplicates.toArray(new Integer[] {}); 
}