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

পাইথনে বাইনারি ট্রির টপ ভিউ (Top View) বের করা

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

তবে, যদি ইনপুট হয় ইমেজের মতো, তবে আউটপুট হবে [3, 5, 8, 6, 9], কারণ 3, 2-এর উপরে আছে এবং 5, 7-এর উপরে আছে তাই সেগুলো দেখা যাবে না।

এটি সমাধান করতে, আমরা এই ধাপগুলো ফলো করব:

  • view := একটি খালি ম্যাপ
  • q := একটি ডবল-এন্ডেড কিউ
  • q-তে (root, 0) পেয়ার পুশ করুন
  • start := inf, end := -inf
  • যদি q খালি না হয়:
    • (node, coord) := q-এর লেফট এলিমেন্ট, তারপর লেফট এলিমেন্ট রিমুভ করুন
    • start := min(start, coord)
    • end := max(end, coord)
    • যদি coord view-এ না থাকে, তবে view[coord] := node.val
    • যদি node.left নাল না হয়, তবে (node.left, coord - 1) q-তে পুশ করুন
    • যদি node.right নাল না হয়, তবে (node.right, coord + 1) q-তে পুশ করুন
  • res := একটি খালি লিস্ট
  • i = start থেকে end পর্যন্ত:
    • যদি i view-এ থাকে, তবে view[i] res-এ অ্যাপেন্ড করুন
  • res রিটার্ন করুন

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

উদাহরণ

from collections import deque

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

class Solution:
    def solve(self, root):
        view = {}
        q = deque()
        q.append((root, 0))
        start = float("inf")
        end = float("-inf")
        while q:
            node, coord = q.popleft()
            start = min(start, coord)
            end = max(end, coord)
            if coord not in view:
                view[coord] = node.val
            if node.left:
                q.append((node.left, coord - 1))
            if node.right:
                q.append((node.right, coord + 1))
        res = []
        for i in range(start, end + 1):
            if i in view:
                res.append(view[i])
        return res

ob = Solution()
root = TreeNode(5)
root.left = TreeNode(3)
root.right = TreeNode(8)
root.right.left = TreeNode(7)
root.right.right = TreeNode(6)
root.right.left.left = TreeNode(2)
root.right.right.right = TreeNode(9)
print(ob.solve(root))

ইনপুট

root = TreeNode(5) root.left = TreeNode(3) root.right = TreeNode(8) root.right.left = TreeNode(7) root.right.right = TreeNode(6) root.right.left.left = TreeNode(2) root.right.right.right = TreeNode(9)

আউটপুট

[3, 5, 8, 6, 9]
  1. পাইথনে বাইনারি ট্রিতে জোড় মান সম্বলিত সর্বোচ্চ পথ খুঁজে বের করার প্রোগ্রাম

  2. পাইথনে বাইনারি ট্রিতে k-দৈর্ঘ্যের পথের সংখ্যা খুঁজে বের করার প্রোগ্রাম

  3. পাইথনে বাইনারি ট্রিতে রুট থেকে লিফ পর্যন্ত যেকোনো পথের সর্বোচ্চ যোগফল খুঁজে বের করার প্রোগ্রাম

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