چیک کریں کہ دو بائنری ٹری کی تمام سطحیں انگرامگرام ہیں یا نہیں


مشکل سطح ہارڈ
اکثر پوچھا جاتا ہے ایڈوب ایمیزون فیس بک فانٹکس فورکائٹس گرین اورنج
انگرام ثنائی درخت قطار درخت

مسئلہ یہ بیان

مسئلہ "چیک کریں کہ آیا دو بائنری ٹری کی تمام سطحیں انگرامگرام ہیں یا نہیں" کہتی ہیں کہ آپ کو دو بائنری درخت دیئے گئے ہیں ، چیک کریں کہ آیا دونوں درختوں کی تمام سطحیں انگرامگرام ہیں یا نہیں۔

مثال کے طور پر

ان پٹ

چیک کریں کہ دو بائنری ٹری کی تمام سطحیں انگرامگرام ہیں یا نہیں

true

ان پٹ

چیک کریں کہ دو بائنری ٹری کی تمام سطحیں انگرامگرام ہیں یا نہیں

false

الگورتھم یہ چیک کرنے کے ل if کہ دو بائنری ٹری کی تمام سطحیں اینگگرام ہیں یا نہیں

ہم استعمال کریں گے ہیشنگ اس مسئلے کو حل کرنے کے ل. ہر دو کی سطح کو عبور کریں درختوں ایک ہی وقت میں. پہلے درخت کے ل current ، موجودہ سطح کی عنصر اور تعدد کو ایک میں ذخیرہ کریں ہش میپ اور دوسرے درخت کی موجودہ سطح کے لئے ، اگر موجودہ عنصر ہش میپ میں موجود نہیں ہے۔ تمام سطحیں اینگرامگرام نہیں ہیں۔ ورنہ ہش میپ میں اس عنصر کی تعدد کو کم کریں۔ اگر عبور کے اختتام پر ، ہش میپ خالی ہے ، تو دونوں درختوں کی یہ سطح اگام لیول تک انگرام جاری ہے ، بصورت دیگر تمام سطحیں ایسی نہیں ہیں اینگنامس.

  1. دو بنائیں دمیں q1 اور q2 ، Q1 درخت 1 کو عبور کرنے کے لئے استعمال کیا جاتا ہے اور Q2 کو Q2 کو عبور کرنے کے لئے استعمال کیا جاتا ہے۔
  2. درخت 1 سے کیو 1 اور درخت کی جڑ 2 سے کیو 2 تک دبائیں۔
  3. جبکہ یا تو Q1 خالی نہیں ہے یا Q2 خالی نہیں ہے 4 ، 5 اور 6 مرحلہ دہرانا ہے۔
  4. موجودہ سطح کے عناصر کی عناصر اور تعدد کو اسٹور کرنے کے لئے ہش میپ بنائیں۔ عددی سائز 1 کیو 1 کے سائز کے طور پر شروع کریں۔ سائز 0 سے کم 1 تک لوپ چلائیں۔ ہر تکرار پر قطار Q1 سے ایک عنصر پاپ آؤٹ کریں اور اسے ہش میپ میں شامل کریں۔ موجودہ عنصر کے بچوں کو قطار.
  5. عددی سائز 2 کیو 2 کے سائز کے طور پر شروع کریں۔ سائز لو سے 0 سے کم لوپ چلائیں۔ ہر تکرار پر ، قطار کیو 2 سے کسی عنصر کو خارج کردیں اور اگر یہ عنصر ہش میپ میں موجود ہے تو اس کی تعدد کو 2 سے کم کردیں ، ورنہ فورا. ہی جھوٹ واپس آجائیں۔
  6. اگر لوپ کے اختتام پر ، ہیش میپ میں عنصر موجود ہے ، جھوٹی لوٹائیں ، ورنہ دو درختوں کی یہ سطح اینگگرام ہے ، اگلی سطح تک جاری رکھیں۔
  7. اگر ہم یہاں پہنچ جاتے ہیں تو ، دونوں درختوں کی تمام سطحیں انگرامگرام ہیں ، لہذا صحیح لوٹ آئیں۔

ضابطے

جاوا کوڈ چیک کرنے کے لئے کہ آیا دو بائنری ٹری کی تمام سطحیں انگرامگرام ہیں یا نہیں

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;

class CheckIfAllLevelsOfTwoBinaryTreeAreAnagramsOrNot {
    // class representing node of a binary tree
    static class Node {
        int data;
        Node left, right;

        public Node(int data) {
            this.data = data;
        }
    }

    private static boolean checkIsAnagrams(Node tree1, Node tree2) {
        // create two queues
        Queue<Node> q1 = new LinkedList<>();
        Queue<Node> q2 = new LinkedList<>();
        // add root of tree1 to q1
        q1.add(tree1);
        // add root of tree2 to q2
        q2.add(tree2);

        // while either of q1 or q2 is not empty
        while (!q1.isEmpty() || !q2.isEmpty()) {
            // create a hash map to store freq of elements of a level
            HashMap<Integer, Integer> freq = new HashMap<>();

            // traverse this level of tree1
            int size1 = q1.size();
            for (int i = 0; i < size1; i++) {
                // remove a node from queue
                Node curr = q1.poll();
                // add the element to hash map
                if (freq.containsKey(curr.data)) {
                    freq.put(curr.data, freq.get(curr.data) + 1);
                } else {
                    freq.put(curr.data, 1);
                }

                // add curr's children to queue
                if (curr.left != null)
                    q1.add(curr.left);
                if (curr.right != null)
                    q1.add(curr.right);
            }

            // traverse this level of tree2
            int size2 = q2.size();
            for (int i = 0; i < size2; i++) {
                // remove a node from q2
                Node curr = q2.poll();
                // decrease the frequency of this element in hash map
                if (freq.containsKey(curr.data)) {
                    int frequency = freq.get(curr.data);
                    frequency--;
                    if (frequency == 0) {
                        freq.remove(curr.data);
                    } else {
                        freq.put(curr.data, frequency);
                    }
                } else {
                    return false;
                }

                // add curr's children to queue
                if (curr.left != null)
                    q2.add(curr.left);
                if (curr.right != null)
                    q2.add(curr.right);
            }

            // if there is an element in the hash map
            // the two tree's current levels are not anagrams
            if (freq.size() > 0) {
                return false;
            }
        }

        // all the levels are anagrams, return true
        return true;
    }

    public static void main(String[] args) {
        // Example 1
        Node tree1_1 = new Node(5);
        tree1_1.left = new Node(4);
        tree1_1.right = new Node(3);
        tree1_1.left.left = new Node(2);
        tree1_1.left.right = new Node(1);

        Node tree2_1 = new Node(5);
        tree2_1.left = new Node(3);
        tree2_1.right = new Node(4);
        tree2_1.left.left = new Node(1);
        tree2_1.right.left = new Node(2);

        System.out.println(checkIsAnagrams(tree1_1, tree2_1));

        // Example 2
        Node tree1_2 = new Node(5);
        tree1_2.left = new Node(7);
        tree1_2.right = new Node(8);
        tree1_2.left.left = new Node(9);

        Node tree2_2 = new Node(5);
        tree2_2.left = new Node(7);
        tree2_2.right = new Node(8);
        tree2_2.left.left = new Node(1);
        tree2_2.right.left = new Node(2);

        System.out.println(checkIsAnagrams(tree1_2, tree2_2));
    }
}
true
false

سی ++ کوڈ چیک کرنے کے لئے کہ آیا دو بائنری ٹری کی تمام سطحیں انگرامگرام ہیں یا نہیں

#include<bits/stdc++.h> 
using namespace std; 

// class representing node of a binary tree
class Node {
    public:
    int data;
    Node *left;
    Node *right;
    
    Node(int d) {
        data = d;
        left = right = NULL;
    }
};

// function to create a new node with given data
Node* newNode(int data) {
    Node *node = new Node(data);
    return node;
}

bool checkIsAnagrams(Node *tree1, Node *tree2) {
    // create two queues
    queue<Node *> q1;
    queue<Node *> q2;
    // add root of tree1 to q1
    q1.push(tree1);
    // add root of tree2 to q2
    q2.push(tree2);
    
    // while either of q1 or q2 is not empty
    while (!q1.empty() || !q2.empty()) {
        // create a hash map to store freq of elements of a level
        unordered_map<int, int> freq;
        
        // traverse this level of tree1
        int size1 = q1.size();
        for (int i = 0; i < size1; i++) {
            // remove a node from queue
            Node *curr = q1.front();
            q1.pop();
            
            // add the element to hash map
            auto itr = freq.find(curr->data);
            if (itr != freq.end()) {
                itr->second++;
            } else {
                freq.insert(make_pair(curr->data, 1));
            }
            
            // add curr's children to queue
            if (curr->left != NULL)
                q1.push(curr->left);
            if (curr->right != NULL)
                q1.push(curr->right);
        }
        
        // traverse this level of tree2
        int size2 = q2.size();
        for (int i = 0; i < size2; i++) {
            // remove a node from q2
            Node *curr = q2.front();
            q2.pop();
    
            // decrease the frequency of this element in hash map
            auto itr = freq.find(curr->data);
            if (itr != freq.end()) {
                itr->second--;
                if (itr->second == 0) {
                    freq.erase(itr);
                }
            } else {
                return false;
            }
            
            // add curr's children to queue
            if (curr->left != NULL)
                q2.push(curr->left);
            if (curr->right != NULL)
                q2.push(curr->right);
        }
        
        // if there is an element in the hash map
        // the two tree's current levels are not anagrams
        if (freq.size() != 0)
            return false;
    }
    
    // all the levels are anagrams, return true
    return true;
}

int main() {
    // Example 1
    Node *tree1_1 = newNode(5);
    tree1_1->left = newNode(4);
    tree1_1->right = newNode(3);
    tree1_1->left->left = newNode(2);
    tree1_1->left->right = newNode(1);

    Node *tree2_1 = new Node(5);
    tree2_1->left = newNode(3);
    tree2_1->right = newNode(4);
    tree2_1->left->left = newNode(1);
    tree2_1->right->left = newNode(2);

    if (checkIsAnagrams(tree1_1, tree2_1)) {
        cout<<"true"<<endl;
    } else {
        cout<<"false"<<endl;
    }

    // Example 2
    Node *tree1_2 = newNode(5);
    tree1_2->left = newNode(7);
    tree1_2->right = newNode(8);
    tree1_2->left->left = newNode(9);

    Node *tree2_2 = newNode(5);
    tree2_2->left = newNode(7);
    tree2_2->right = newNode(8);
    tree2_2->left->left = newNode(1);
    tree2_2->right->left = newNode(2);

    if (checkIsAnagrams(tree1_2, tree2_2)) {
        cout<<"true"<<endl;
    } else {
        cout<<"false"<<endl;
    }   
    
    return 0;
}
true
false

پیچیدگی کا تجزیہ

چونکہ ہم نے ایک ہی وقت میں دونوں درختوں کو عبور کیا اور لیول آرڈر ٹرورسال کے ل two دو قطاریں استعمال کیں

وقت کی پیچیدگی = O (n + m)
خلائی پیچیدگی = O (n + m)
جہاں n درخت 1 میں نوڈس کی تعداد ہے اور میٹر درخت 2 میں نوڈس کی تعداد ہے۔