Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Python

पायथन में O(n) समय और O(1) स्थान में BST का माध्यिका ज्ञात कीजिए


मान लीजिए कि हमारे पास बाइनरी सर्च ट्री (BST) है, तो हमें इसका माध्यिका ज्ञात करना होगा। हम नोड्स की सम संख्या के लिए जानते हैं, माध्यिका =((n/2th नोड + (n+1)/2th नोड) /2 विषम संख्या में नोड्स के लिए, माध्यिका =(n+1)/2th नोड।

तो, अगर इनपुट पसंद है

पायथन में O(n) समय और O(1) स्थान में BST का माध्यिका ज्ञात कीजिए

तो आउटपुट 7

. होगा

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • अगर रूट कोई नहीं के समान है, तो

    • वापसी 0

  • node_count :=पेड़ में नोड्स की संख्या

  • count_curr :=0

  • वर्तमान:=जड़

  • जबकि करंट शून्य नहीं है, करें

    • अगर current.left null, तो

      • count_curr :=count_curr + 1

      • अगर node_count mod 2 0 नहीं है और count_curr (नोड_काउंट + 1) /2 के समान है, तो

        • पिछला.डेटा लौटाएं

      • अन्यथा जब नोड_काउंट मॉड 2 0 है और count_curr वही है (नोड_काउंट/2) +1, तब

        • वापसी (पिछला.डेटा + करंट.डेटा) /2

      • पिछला:=वर्तमान

      • करंट:=करंट। राइट

    • अन्यथा,

      • पिछला:=वर्तमान.बाएं

      • जबकि पिछला.राइट शून्य नहीं है और पिछला.राइट वर्तमान के समान नहीं है, करें

        • पिछला:=पिछला.दाएं

      • अगर पिछला.दायाँ शून्य है, तो

        • पिछला.दायाँ:=वर्तमान

        • वर्तमान:=वर्तमान.बाएं

      • अन्यथा,

        • पिछला.दाएं:=कोई नहीं

        • पिछला:=पिछला

        • count_curr :=count_curr + 1

        • अगर node_count mod 2 0 नहीं है और count_curr (नोड_काउंट + 1) / 2 के समान है, तो

          • वर्तमान.डेटा लौटाएं

        • अन्यथा जब नोड_काउंट मॉड 2 0 है और count_curr वही है (नोड_काउंट / 2) + 1, तब

          • वापसी (पिछला.डेटा+वर्तमान.डेटा)/2

        • पिछला:=वर्तमान

        • करंट:=करंट। राइट

उदाहरण

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

class TreeNode:
   def __init__(self, data):
      self.data = data
      self.left = None
      self.right = None
def number_of_nodes(root):
   node_count = 0
   if (root == None):
      return node_count
   current = root
   while (current != None):
      if (current.left == None):
         node_count+=1
         current = current.right
      else:
         previous = current.left
         while (previous.right != None and previous.right != current):
            previous = previous.right
         if(previous.right == None):
            previous.right = current
            current = current.left
         else:
            previous.right = None
            node_count += 1
            current = current.right
   return node_count
def calculate_median(root):
   if (root == None):
      return 0
   node_count = number_of_nodes(root)
   count_curr = 0
   current = root
   while (current != None):
      if (current.left == None):
         count_curr += 1
         if (node_count % 2 != 0 and count_curr == (node_count + 1)//2):
            return previous.data
         elif (node_count % 2 == 0 and count_curr == (node_count//2)+1):
            return (previous.data + current.data)//2
         previous = current
         current = current.right
      else:
         previous = current.left
         while (previous.right != None and previous.right != current):
            previous = previous.right
         if (previous.right == None):
            previous.right = current
            current = current.left
         else:
            previous.right = None
            previous = previous
            count_curr+= 1
            if (node_count % 2 != 0 and count_curr == (node_count + 1) // 2 ):
               return current.data
            elif (node_count%2 == 0 and count_curr == (node_count // 2) + 1):
               return (previous.data+current.data)//2
            previous = current
            current = current.right
root = TreeNode(7)
root.left = TreeNode(4)
root.right = TreeNode(9)
root.left.left = TreeNode(2)
root.left.right = TreeNode(5)
root.right.left = TreeNode(8)
root.right.right = TreeNode(10)
print(calculate_median(root))

इनपुट

root = TreeNode(7)
root.left = TreeNode(4)
root.right = TreeNode(9)
root.left.left = TreeNode(2)
root.left.right = TreeNode(5)
root.right.left = TreeNode(8)
root.right.right = TreeNode(10)

आउटपुट

7

  1. पायथन में बीएसटी को क्रमबद्ध और अक्रमांकन करें

    मान लीजिए कि हम एक बाइनरी सर्च ट्री को क्रमबद्ध और डीरियलाइज़ करने के लिए एक एल्गोरिथम डिज़ाइन करना चाहते हैं। सीरियलाइजेशन कुछ (डेटा संरचना या ऑब्जेक्ट) को बिट्स के अनुक्रम में परिवर्तित करने की प्रक्रिया है ताकि इसे फ़ाइल या मेमोरी बफर में संग्रहीत किया जा सके, या नेटवर्क कनेक्शन लिंक पर प्रसारित

  1. सेलेनियम और पायथन तत्वों और पाठ को खोजने के लिए?

    हम सेलेनियम वेबड्राइवर के साथ तत्वों और उसके पाठ को पा सकते हैं। सबसे पहले हमें किसी भी लोकेटर जैसे आईडी, क्लासनाम, सीएसएस आदि की मदद से तत्व की पहचान करनी होगी। फिर पाठ प्राप्त करने के लिए हमें पाठ . की सहायता लेनी होगी विधि। सिंटैक्स s = driver.find_element_by_css_selector("h4").text यह

  1. पायथन का उपयोग करके वेबसाइट अलार्म बनाएं

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