কম্পিউটার টিউটোরিয়াল

Python দিয়ে এক্সপ্রেশন ট্রি বানানো এবং ইভ্যালুয়েট করার প্রোগ্রাম


মান লাগিয়ে, আমাদের একটি এক্সপ্রেশন ট্রির পোস্ট-অর্ডার ট্রাভার্সাল দেওয়া আছে। আমাদের দেওয়া পোস্ট-অর্ডার ট্রাভার্সাল থেকে এক্সপ্রেশন ট্রি বানাতে হবে, এবং তারপর এক্সপ্রেশনটি ইভ্যালুয়েট করতে হবে। আমরা এক্সপ্রেশন ট্রির রুট এবং ট্রির ইভ্যালুয়েটেড মান রিটার্ন করব।

যেমন, ইনপুট যদি এমন হয়:

Python দিয়ে এক্সপ্রেশন ট্রি বানানো এবং ইভ্যালুয়েট করার প্রোগ্রাম

তবে আউটপুট হবে -7।

ইনপুট হিসেবে দেওয়া ট্রির পোস্টফিক্স অর্ডার হল ['1', '2', '+', '3', '4', '+', '*']। এক্সপ্রেশনটি ইভ্যালুয়েট করলে হয় (1 - 2) * (3 + 4); যা সমান -7।

এটি সমাধান করতে আমরা নিচের ধাপগুলো অনুসরণ করব:

  • LEFT = 0, RIGHT = 1
  • একটি ফাংশন evaluate() ডিফাইন করুন। এটি root নেবে:
    • যদি root.val न्यুমেরিক ভ্যালু হয়, তবে root.val-এর ইন্টিজার রিপ্রেজেন্টেশন রিটার্ন করুন
    • left_val := evaluate(root.left)
    • right_val := evaluate(root.right)
    • যদি root.val == '+' হয়, তবে left_val + right_val রিটার্ন করুন
    • অন্যথায় যদি root.val == '-' হয়, তবে left_val - right_val রিটার্ন করুন
    • অন্যথায় যদি root.val == '*' হয়, তবে left_val * right_val রিটার্ন করুন
    • অন্যথায় যদি root.val == '/' হয়, তবে (left_val / right_val) এর ফ্লোর ভ্যালু রিটার্ন করুন
  • একটি ফাংশন buildTree() ডিফাইন করুন। এটি postfix নেবে:
    • root := null
    • stack := একটি নতুন লিস্ট
    • postfix খালি না হওয়া পর্যন্ত:
      • curr := postfix-এর শেষ এলিমেন্ট ডিলিট করুন
      • curr_node := curr মান ধারণকারী একটি নতুন নোড
      • যদি root খালি হয়, তবে root := curr_node
      • যদি stack খালি না হয়, তবে:
        • parent := stack-এর শেষ এলিমেন্ট ডিলিট করুন
        • side := parent
        • যদি side == LEFT হয়, তবে parent.left := curr_node
        • অন্যথায়, parent.right := curr_node
      • যদি curr न्यুমেরিক্যাল ভ্যালু না হয়, তবে:
        • (curr_node, LEFT) stack-এ যোগ করুন
        • (curr_node, RIGHT) stack-এ যোগ করুন
    • root রিটার্ন করুন

বेहतर বোঝার জন্য নিচের ইমপ্লিমেন্টেশন দেখুন:

উদাহরণ

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. পাইথনে বাইনারি ট্রি আপডেট করে লেফট ও রাইট সাবট্রির যোগফল নিজসহ খুঁজে বের করার প্রোগ্রাম

  2. পাইথনে বাইনারি ট্রি BST কিনা যাচাই করার প্রোগ্রাম

  3. পাইথনে বাইনারি ট্রির সর্বাধিক প্রস্থ (Maximum Width) বের করার প্রোগ্রাম

  4. পাইথনে পোস্টঅর্ডার ও ইনঅর্ডার থেকে বাইনারি ট্রি তৈরি করুন