Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Python

पायथन में दिए गए बाइनरी ट्री में लिंक्ड लिस्ट मौजूद है या नहीं जांचने का प्रोग्राम

मान लीजिए हमें एक बाइनरी ट्री दी गई है जिसका रूट नोड 'root' है और एक लिंक्ड लिस्ट जिसका हेड नोड 'head' है। हमें यह ढूंढना है कि वह लिंक्ड लिस्ट उस बाइनरी ट्री में मौजूद है या नहीं। यदि ट्री में नोड्स का एक सेट एक-दूसरे से लिंक्ड लिस्ट के क्रम में जुड़ा हुआ है, और वह क्रम प्रदान की गई लिंक्ड लिस्ट के समान है, तो हम 'True' लौटाते हैं, अन्यथा 'False'।

इसलिए, यदि इनपुट है:

पायथन में दिए गए बाइनरी ट्री में लिंक्ड लिस्ट मौजूद है या नहीं जांचने का प्रोग्राम

Tree

पायथन में दिए गए बाइनरी ट्री में लिंक्ड लिस्ट मौजूद है या नहीं जांचने का प्रोग्राम

Linked List

तो आउटपुट True होगा।

समाधान दृष्टिकोण

  • लिंक्ड लिस्ट को सरणी में बदलें
  • केएमपी (KMP) एल्गोरिदम के लिए प्रीफिक्स टेबल बनाएं
  • ट्री को DFS से ट्रैवर्स करते हुए KMP मिलान करें
  • यदि पूरा पैटर्न मिल जाए तो True लौटाएं

उदाहरण कार्यान्वयन

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

class ListNode:
    def __init__(self, val, next=None):
        self.val = val
        self.next = next

def insert(temp, data):
    que = []
    que.append(temp)
    while len(que):
        temp = que[0]
        que.pop(0)
        if not temp.left:
            if data is not None:
                temp.left = TreeNode(data)
            else:
                temp.left = TreeNode(0)
            break
        else:
            que.append(temp.left)
        if not temp.right:
            if data is not None:
                temp.right = TreeNode(data)
            else:
                temp.right = TreeNode(0)
            break
        else:
            que.append(temp.right)

def make_tree(elements):
    node = TreeNode(elements[0])
    for element in elements[1:]:
        insert(node, element)
    return node

def make_list(elements):
    head = ListNode(elements[0])
    for element in elements[1:]:
        ptr = head
        while ptr.next:
            ptr = ptr.next
        ptr.next = ListNode(element)
    return head

def solve(root, head):
    arr = []
    start = head
    while start:
        arr += (start.val,)
        start = start.next
    size = len(arr)
    temp_arr = [-1] * (size + 1)
    for node in range(1, size + 1):
        temp_arr[node] = temp_arr[node - 1] + 1
        while temp_arr[node] > 0 and arr[node - 1] != arr[temp_arr[node] - 1]:
            temp_arr[node] = temp_arr[temp_arr[node] - 1] + 1
    
    def helper(root, val):
        if val >= size:
            return True
        if not root:
            return False
        val += 1
        while val > 0 and root.val != arr[val - 1]:
            val = temp_arr[val - 1] + 1
        if helper(root.left, val) or helper(root.right, val):
            return True
        return False
    
    return helper(root, 0)

root = make_tree([6, 7, 8, 9, 10])
head = make_list([6, 7, 10])
print(solve(root, head))

इनपुट

root = make_tree([6, 7, 8, 9, 10])
head = make_list([6, 7, 10])
print(solve(root, head))

आउटपुट

True
  1. पायथन में दिए गए ट्री से सबसे बड़ा बाइनरी सर्च सबट्री खोजने का प्रोग्राम पायथन में दिए गए ट्री से सबसे बड़ा बाइनरी सर्च सबट्री खोजने का प्रोग्राम

    मान लीजिए हमारे पास एक बाइनरी ट्री है, हमें सबसे बड़ा सबट्री (अधिकतम नोड्स के साथ) ढूंढना है जो बाइनरी सर्च ट्री हो।उदाहरण के लिए, यदि इनपुट ट्री है:तो आउटपुट होगा:समाधान दृष्टिकोणइस समस्या को हल करने के लिए हम पोस्ट-ऑर्डर ट्रैवर्सल का उपयोग करेंगे:max_size := [0], max_node := [null]traverse(node) फ

  1. पायथन में लिंक्ड लिस्ट को जिग-जैग बाइनरी ट्री में बदलने का प्रोग्राम पायथन में लिंक्ड लिस्ट को जिग-जैग बाइनरी ट्री में बदलने का प्रोग्राम

    मान लीजिए हमारे पास एक सिंगली लिंक्ड लिस्ट है, हमें इसे निम्न नियमों का उपयोग करके बाइनरी ट्री पथ में बदलना है:लिंक्ड लिस्ट का हेड रूट है।प्रत्येक बाद का नोड पैरेंट का बायां बच्चा है यदि उसका मान कम है, अन्यथा यह दायां बच्चा होगा।उदाहरण के लिए, यदि इनपुट [2,1,3,4,0,5] है, तो आउटपुट ट्री होगा:समाधान

  1. पायथन में बाइनरी ट्री पर k-लंबाई के पथ खोजने का प्रोग्राम पायथन में बाइनरी ट्री पर k-लंबाई के पथ खोजने का प्रोग्राम

    मान लीजिए हमारे पास एक बाइनरी ट्री है जिसमें अद्वितीय मान हैं और हमारे पास एक अन्य मान k है, हमें ट्री में k-लंबाई के अद्वितीय पथों की संख्या ढूंढनी है। पथ पैरेंट से चाइल्ड या चाइल्ड से पैरेंट की ओर जा सकते हैं। हम दो पथों को अलग मानेंगे जब कोई नोड एक पथ में दिखाई देता है लेकिन दूसरे में नहीं। उदाह