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

Pythonのプレオーダートラバーサルから二分探索木を構築する


指定されたプレオーダートラバーサルに一致するバイナリ検索ツリーを作成する必要があるとします。したがって、事前注文トラバーサルが[8,5,1,7,10,12]のような場合、出力は[8,5,10,1,7、null、12]になるため、ツリーは-になります。

Pythonのプレオーダートラバーサルから二分探索木を構築する

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

  • root:=0 th プレオーダートラバーサルリストのノード
  • stack:=スタック、およびルートをスタックにプッシュします
  • プレオーダーリストの2番目の要素の各要素iについて
    • i:=値iのノード
    • iの値がスタックトップ要素の最上位である場合、
      • スタックトップノードの左側:=i
      • スタックにiを挿入します
    • それ以外の場合
      • スタックが空ではなく、スタックの最上位要素の値
      • 最後:=スタックの一番上
      • スタックから要素をポップ
    • 最後のノードの右側:=i
    • スタックにiを挿入します
  • ルートを返す
  • 理解を深めるために、次の実装を見てみましょう-

    class Solution(object):
       def bstFromPreorder(self, preorder):
          """
          :type preorder: List[int]
          :rtype: TreeNode
          """
          root = TreeNode(preorder[0])
          stack = [root]
          for i in preorder[1:]:
             i = TreeNode(i)
             if i.val<stack[-1].val:
                stack[-1].left = i
                stack.append(i)
             else:
                while stack and stack[-1].val<i.val:
                   last = stack.pop(-1)
                last.right = i
                stack.append(i)
          return root

    入力

    [8,5,1,7,10,12]

    出力

    [8,5,10,1,7,null,12]

    1. Pythonのバイナリ検索ツリーの最も低い共通の祖先

      二分探索木があるとします。与えられた2つのノードの中で最も低い共通の祖先ノードを見つける必要があります。 2つのノードpとqのLCAは、実際には、pとqの両方を子孫として持つツリーの最下位ノードです。したがって、二分木が[6、2、8、0、4、7、9、null、null、3、5]のような場合。ツリーは次のようになります- ここで、2と8のLCAは6です これを解決するには、次の手順に従います- ツリーが空の場合は、nullを返します pとqの両方がrootと同じ場合は、rootを返します left:=pとqを使用したルートの左側のサブツリーのLCA right:=pとqを使用し

    2. ソートされた配列をPythonでバイナリ検索ツリーに変換する

      ソートされた配列Aが1つあるとします。高さのバランスが取れた2分探索を1つ生成する必要があります。この問題では、高さのバランスが取れた二分木は、実際には、すべてのノードの2つのサブツリーの深さが1を超えて異ならない二分木です。配列が[-10、-3、0、5、9のようであるとします。 ]。したがって、考えられる出力の1つは、[0、-3、9、-10、null、5]のようになります。 これを解決するために、次の手順に従います。 Aが空の場合は、Nullを返します 中間要素を見つけて、ルートにします 配列を2つのサブ配列、中央要素の左側と中央要素の右側に分割します 左側のサブアレイと右側のサ