Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでO(n)時間とO(1)空間でBSTの中央値を見つける


二分探索木(BST)があるとすると、その中央値を見つける必要があります。偶数のノードの場合、中央値=((n / 2番目のノード+(n + 1)/ 2番目のノード)/ 2奇数のノードの場合、中央値=(n + 1)/2番目のノードです。

したがって、入力が次のような場合

PythonでO(n)時間とO(1)空間でBSTの中央値を見つける

その場合、出力は7になります

これを解決するには、次の手順に従います-

  • rootがNoneと同じ場合、

    • 0を返す

  • node_count:=ツリー内のノードの数

  • count_curr:=0

  • 現在:=ルート

  • currentがnullでない場合は、実行してください

    • current.left nullの場合、

      • count_curr:=count_curr + 1

      • node_count mod 2が0でなく、count_currが(node_count + 1)/ 2と同じである場合、

        • previous.dataを返す

      • それ以外の場合、node_count mod 2が0で、count_currが(node_count / 2)+1と同じである場合、

        • return(previous.data + current.data)/ 2

      • 前:=現在

      • current:=current.right

    • それ以外の場合

      • 前:=current.left

      • previous.rightはnullではなく、previous.rightはcurrentと同じではありませんが、実行してください

        • previous:=previous.right

      • previous.rightがnullの場合、

        • previous.right:=current

        • current:=current.left

      • それ以外の場合

        • previous.right:=なし

        • 前:=前

        • count_curr:=count_curr + 1

        • node_count mod 2が0でなく、count_currが(node_count + 1)/ 2と同じである場合、

          • current.dataを返す

        • それ以外の場合、node_count mod 2が0で、count_currが(node_count / 2)+ 1と同じである場合、

          • return(previous.data + current.data)/ 2

        • 前:=現在

        • current:=current.right

理解を深めるために、次の実装を見てみましょう-

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. 要素とテキストを見つけるためのSeleniumとPython?

    Selenium Webdriverを使用して、要素とそのテキストを見つけることができます。まず、id、classname、cssなどのロケーターを使用して要素を特定する必要があります。次に、テキストを取得するには、テキストを使用する必要があります。 メソッド。 構文 s = driver.find_element_by_css_selector("h4").text ここでドライバー webdriverオブジェクトです。メソッドfind_element_by_css_selector cssロケータータイプで要素を識別するために使用され、ロケーター値は引数としてメソッド

  2. Pythonを使用してWebサイトアラームを作成する

    このセクションでは、Pythonを使用してWebサイトの警報システムを作成する方法を説明します。 問題の説明 ウェブサイトのURLと時間を取得して、ブラウザでウェブサイトのURLを開きます。システム時刻が指定時刻に達すると、Webページが開きます。 ブックマークセクションにさまざまなWebページを保存できます。時々、私たちはいくつかの仕事をするために特定の時間に毎日いくつかのウェブページを開く必要があります。そのために、このタイプのWebサイトアラームを設定して作業を行うことができます。 この場合、sys、Webブラウザ、timeなどの標準ライブラリモジュールを使用しています。 特定の時