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

পাইথনে দুটি BST থেকে দিয়ে সম সংখ্যায় পেয়ার (pair) খুঁজে বের করা

দুটি বাইনারি সার্চ ট্রি (BST) এবং একটি টার্গেট সম (sum) দেওয়া আছে। দুটি BST থেকে এক-একটি উপাদান নিয়ে যেসব পেয়ার (pair) বने যেন তাদের যোগফল টার্গেট সমের সমান হয়, সেগুলো খুঁজে বের করতে হবে।

উদাহরণ

ইনপুট: Sum = 12

BST ১: ৯, ১১, ৪, ৭, ২, ৬, ১৫, ১৪

BST ২: ৬, ১৯, ৩, ২, ৪, ৫

আউটপুট: [(6, 6), (7, 5), (9, 3)]

সমাধানের পদ্ধতি

  1. দুই BST-র ইন-অর্ডার ট্রাভার্সাল (In-order traversal) করুন → সাজানো অ্যারে পাওয়া যাবে।
  2. দুটি সাজানো অ্যারে আছে: trav1 (ascending), trav2 (ascending)।
  3. টু-পয়েন্টার (Two-pointer) টেকনিক: trav1-র শুরু (left) এবং trav2-র শেষ (right) থেকে শুরু করুন।
  4. যোগফল == Sum হলে পেয়ার সংরক্ষণ করুন, left++, right--।
  5. যোগফল < Sum হলে left++। যোগফল > Sum হলে right--।

পাইথন কোড


class ListNode:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

def insert(root, key):
    if root is None:
        return ListNode(key)
    if root.data > key:
        root.left = insert(root.left, key)
    else:
        root.right = insert(root.right, key)
    return root

def storeInorder(ptr, traversal):
    if ptr is None:
        return
    storeInorder(ptr.left, traversal)
    traversal.append(ptr.data)
    storeInorder(ptr.right, traversal)

def solve(trav1, trav2, Sum):
    left = 0
    right = len(trav2) - 1
    res = []
    while left < len(trav1) and right >= 0:
        s = trav1[left] + trav2[right]
        if s == Sum:
            res.append((trav1[left], trav2[right]))
            left += 1
            right -= 1
        elif s < Sum:
            left += 1
        else:
            right -= 1
    return res

def get_pair_sum(root1, root2, Sum):
    trav1 = []
    trav2 = []
    storeInorder(root1, trav1)
    storeInorder(root2, trav2)
    return solve(trav1, trav2, Sum)

root1 = None
for element in [9, 11, 4, 7, 2, 6, 15, 14]:
    root1 = insert(root1, element)

root2 = None
for element in [6, 19, 3, 2, 4, 5]:
    root2 = insert(root2, element)

Sum = 12
print(get_pair_sum(root1, root2, Sum))

ইনপুট

[9,11,4,7,2,6,15,14], [6,19,3,2,4,5], 12

আউটপুট

[(6, 6), (7, 5), (9, 3)]
  1. ডাবলি লিংকড লিস্টে প্রদত্ত সমপূর্ণ যুগল খুঁজে বের করা C++-এ

  2. C++-এ BST-এ দেওয়া সমষ্টির এক জোড়া বের করা

  3. ব্যালেন্সড BST-এ দেওয়া সমের সাথে একটি জোড়া খুঁজে বের করা C++-তে

  4. পাইথনে লিস্টের এলিমেন্টগুলোর যোগফল বের করা