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

Pythonを使用して式ツリーを構築および評価するプログラム


式ツリーのポストオーダートラバーサルが与えられたとします。与えられたポストオーダートラバーサルから式ツリーを構築してから、式を評価する必要があります。式ツリーのルートとツリーの評価値を返します。

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

Pythonを使用して式ツリーを構築および評価するプログラム

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

ツリーの入力として指定された接尾辞の順序は、['1'、 '2'、'+'、 '3'、 '4'、'+'、'*']です。評価すると、式は(1 – 2)*(3 + 4);になります。これは-7に相当します。

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

  • 左=0右=1

  • 関数evaluate()を定義します。これが定着します

    • ルートの値が数値の場合、

      • ルートの値の整数表現を返す

    • left_val:=評価(ルートの左側)

    • right_val:=評価(ルートの権利)

    • ルートの値='+'の場合、

      • left_val + right_val

        を返します
    • それ以外の場合、ルートの値='-'の場合、

      • left_val --right_val

        を返します
    • それ以外の場合、ルートの値='*'の場合、

      • left_val * right_val

        を返します
    • それ以外の場合、ルートの値='/'の場合、

      • (left_val / right_val)のフロア値を返す

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

    • ルート:=null

    • スタック:=新しいリスト

    • 接尾辞が空ではない場合は、実行してください

      • curr:=接尾辞から最後の要素を削除する

      • curr_node:=値currを含む新しいノード

      • ルートが空の場合、

        • ルート:=curr_node

      • スタックが空でない場合は、

        • 親:=スタックから最後の要素を削除

        • サイド:=親

        • サイドがLEFTと同じ場合、

          • 親の左側:=curr_node

        • それ以外の場合

          • 親の権利:=curr_node

      • currが数値でない場合は、

        • スタックの最後にタプル(curr_node、LEFT)を挿入します

        • スタックの最後にtuple(curr_node、RIGHT)を挿入します

  • ルートを返す

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

LEFT = 0
RIGHT = 1
class Node():
def __init__(root, val, left = None, right = None):
   root.val = val
   root.left = left
   root.right = right
def evaluate(root):
   if(root.val.isnumeric()):
      return int(root.val)
      left_val = evaluate(root.left)
      right_val = evaluate(root.right)
      return (
         ( root.val == '+' and left_val + right_val ) or
         ( root.val == '-' and left_val - right_val ) or
         ( root.val == '*' and left_val * right_val ) or
         ( root.val == '/' and left_val // right_val )
      )
def buildTree(postfix):
   root = None
   stack = []
   while(postfix):
      curr = postfix.pop()
      curr_node = Node(curr)
      if(not root):
         root = curr_node
      if(stack):
         parent, side = stack.pop()
      if(side == LEFT):
         parent.left = curr_node
      else:
         parent.right = curr_node
      if(not curr.isnumeric()):
         stack.append((curr_node, LEFT))
         stack.append((curr_node, RIGHT))
   return root
root = buildTree(['1', '2', '+', '3', '4', '+', '*'])
print(evaluate(root))

入力

['1', '2', '+', '3', '4', '+', '*']

出力

-7

  1. Pythonで二分木の最大幅を見つけるプログラム

    二分木があるとすると、ツリー内の任意のレベルの最大幅を見つける必要があります。ここで、レベルの幅は、左端のノードと右端のノードの間に保持できるノードの数です。 したがって、入力がのような場合 その場合、出力は2になります これを解決するために、次の手順に従います- マップdを作成し、最小値と最大値を保持するには、最小値は最初は無限大で、最大値は0です 関数dfs()を定義します。これはルートを取ります、pos:=0、depth:=0 ルートがnullの場合、戻り値はありません d [depth、0] =d [depth、0]とposの最小値 d [d

  2. PythonでPostorderとInorderからバイナリツリーを構築する

    二分木のインオーダーおよびポストオーダートラバーサルシーケンスがあるとします。これらのシーケンスからツリーを生成する必要があります。したがって、事後順序と順序順のシーケンスが[9,15,7,20,3]と[9,3,15,20,7]の場合、ツリーは-になります。 手順を見てみましょう- メソッドbuild_tree()を定義します。これは、順序付け、順序付け後-を取ります。 順序リストが空でない場合- root:=postorderの最後の値でツリーノードを作成し、その要素を削除します ind:=順序リスト内のルートデータのインデックス ルートの右:=buil