কম্পিউটার

C++ দৈর্ঘ্যের রুট থেকে পাতার পথে নোডগুলি সরান


একটি গাছ দেওয়া হয়েছে, এবং আমাদের প্রদত্ত k-এর চেয়ে কম দৈর্ঘ্যের পথের পাতার নোডটি সরাতে হবে, উদাহরণস্বরূপ।

ইনপুট -

K = 4.

C++ দৈর্ঘ্যের রুট থেকে পাতার পথে নোডগুলি সরান  K

আউটপুট -

C++ দৈর্ঘ্যের রুট থেকে পাতার পথে নোডগুলি সরান  K

ব্যাখ্যা

The paths were :
1. A -> B -> C -> E length = 4
2. A -> B -> C -> F length = 4
3. A -> B -> D length = 3
4. A -> G -> H length = 3
5. A -> B -> I length = 3
Now as you can see paths 3, 4, 5 have length of 3 which is less than given k so we remove the leaf nodes of these paths i.e. D, H, I.
Now for path 4 and 5 when H and I are removed we notice that now G is also a leaf node with path length 2 so we again remove node G and here our program ends.

আমরা পোস্ট-অর্ডার বিন্যাসে গাছটি অতিক্রম করব; তারপর, আমরা একটি পুনরাবৃত্ত ফাংশন তৈরি করি যা আমাদের পাতার নোডগুলিকে সরিয়ে দেয় যদি তাদের পথের দৈর্ঘ্য K-এর চেয়ে কম হয়।

সমাধান খোঁজার পদ্ধতি

এই পদ্ধতিতে, আমরা এখন পোস্ট-অর্ডার ট্রাভার্সালে অতিক্রম করি; আমরা পুনরাবৃত্তভাবে লিফ নোডগুলিকে অপসারণ করার চেষ্টা করি যেগুলির পাথের দৈর্ঘ্য k-এর চেয়ে কম এবং এভাবে চালিয়ে যান৷

উদাহরণ

উপরের পদ্ধতির জন্য C++ কোড

#include<bits/stdc++.h>
using namespace std;
struct Node{ // structure of our node
    char data;
    Node *left, *right;
};
Node *newNode(int data){ // inserting new node
    Node *node = new Node;
    node->data = data;
    node->left = node->right = NULL;
    return node;
}
Node *trimmer(Node *root, int len, int k){
    if (!root) // if root == NULL then we return
        return NULL;
    root -> left = trimmer(root -> left, len + 1, k); // traversing the left phase
    root -> right = trimmer(root -> right, len + 1, k); // traversing the right phase
    if (!root -> left && !root -> right && len < k){
        delete root;
        return NULL;
    }
    return root;
}
Node *trim(Node *root, int k){
    return trimmer(root, 1, k);
}
void printInorder(Node *root){
    if (root){
        printInorder(root->left);
        cout << root->data << " ";
        printInorder(root->right);
    }
}
int main(){
    int k = 4;
    Node *root = newNode('A');
    root->left = newNode('B');
    root->right = newNode('G');
    root->left->left = newNode('C');
    root->left->right = newNode('D');
    root->left->left->left = newNode('E');
    root->left->left->right = newNode('F');
    root->right->left = newNode('H');
    root->right->right = newNode('I');
    printInorder(root);
    cout << "\n";
    root = trim(root, k);
    printInorder(root);
    return 0;
}

আউটপুট

E C F B D A H G I
E C F B A

উপরের কোডের ব্যাখ্যা

এই কোডে, আমরা একটি পুনরাবৃত্ত ফাংশন ব্যবহার করছি যা আমাদের গাছকে অতিক্রম করছে এবং বাম এবং ডান উপবৃক্ষের পরিসংখ্যান রাখছে। এখন আমরা একটি লিফ নোডে পৌঁছেছি; আমরা সেই নোড পর্যন্ত পথের দৈর্ঘ্য পরীক্ষা করি। যদি পথের দৈর্ঘ্য কম হয়, তাহলে আমরা এই নোডটি মুছে ফেলি, এবং তারপরে আমরা NULL ফেরত দিই; অন্যথায়, কোড চলতে থাকে।

উপসংহার

এই টিউটোরিয়ালে, আমরা রিকারশন ব্যবহার করে

  1. C++ এ আপেক্ষিক অবস্থান সহ সমস্ত রুট থেকে পাতার পাথ প্রিন্ট করুন

  2. C++ ব্যবহার করে রিকার্সন ব্যবহার না করেই রুট থেকে পাতার পাথ প্রিন্ট করার জন্য প্রোগ্রাম

  3. C++ প্রোগ্রামিং-এ রিকার্সন ব্যবহার না করে পাতার পথে রুট প্রিন্ট করুন।

  4. পাইথনে রুট থেকে পাতার পথে অপর্যাপ্ত নোড