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

PythonのStackを使用して、指定されたポストオーダートラバーサルからBSTを構築します


二分探索木のポストオーダートラバーサルが1つあるとします。そこから二分探索木を見つける必要があります。

したがって、入力が[6、12、10、55、45、15]の場合、出力は

PythonのStackを使用して、指定されたポストオーダートラバーサルからBSTを構築します

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

  • 関数solve()を定義します。これには後注文が必要です

  • n:=ポストオーダーのサイズ

  • root:=postorderの最後の要素で新しいツリーノードを作成します

  • stk:=スタック

  • ルートをstkに挿入

  • i:=n-2

  • i> =0の場合、実行

    • x:=値postorder [i]

      で新しいノードを作成します
    • stkが空ではなく、postorder [i]

      • temp:=stkのトップ

      • stkから最上位の要素を削除する

    • tempがnullでない場合、

      • temp.left:=x

    • それ以外の場合

      • stkトップ要素の右側:=x

    • xをstkに挿入

    • i:=i-1

  • ルートを返す

  • メインの方法から、次のようにします-

  • リターンソルブ(ポストオーダー)

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

class TreeNode:
   def __init__(self, data = 0):
      self.val = data
      self.left = None
      self.right = None
def solve(postorder):
   n = len(postorder)
   root = TreeNode(postorder[n - 1])
   stk = []
   stk.append(root)
   i = n - 2
   while ( i >= 0):
      x = TreeNode(postorder[i])
      temp = None
      while (len(stk) > 0 and postorder[i] < stk[-1].val) :
         temp = stk[-1]
         stk.pop()
      if (temp != None):
         temp.left = x
      else:
         stk[-1].right = x
      stk.append(x)
      i = i - 1
   return root
def build_tree(postorder):
   return solve(postorder)
def inord( node):
   if node:
      inord(node.left)
      print( node.val, end = " ")
      inord(node.right)
postorder = [6, 12, 10, 55, 45, 15]
root = build_tree(postorder)
print( "Inorder traversal:", end = " ")
inord(root)

入力

[6, 12, 10, 55, 45, 15]

出力

6 10 12 15 45 55

  1. Pythonでの二分木順序トラバーサル

    二分木があるとします。再帰を使用せずに、順序どおりのトラバーサルスキームを使用してこのツリーをトラバースする必要があります。したがって、ツリーが次のような場合 その場合、トラバーサルは[2,5,7,10,15,20]になります。 これを解決するには、次の手順に従います- 2つの配列resとスタックを作成し、curr:=rootを設定します 1つの無限ループを実行します 現在がnullではない場合 currをスタックにプッシュし、curr:=currの左側に設定します スタックの長さが0の場合、resを返します node:=スタックからポップされた要素 ノードの値をresに

  2. Pythonでのスタックおよびキューとしてのリストの使用

    この記事では、Python3.xのスタックとキューの構造について学習します。またはそれ以前。ここでは、これらのデータ構造内での動作と変更について説明します- これには-が含まれます 挿入操作(プッシュ、エンキュー) 削除操作(ポップ、デキュー) 表示/トラバース操作 前提条件 :リストとリスト操作 関連データ構造 :リスト操作 関連画像 スタック スタックでは、オブジェクトは互いに重ねて格納され、これらのオブジェクトは到着の逆の順序で削除されます。つまり、LIFOの概念に従います。 LIFOは、スタックデータ構造で後入れ先出しタイプの配置に従うことを意味します。 スタックで