কম্পিউটার

C++ এ k মান সহ লিফ নোড মুছে ফেলবেন?


আসুন প্রথমে স্ট্রাকটটি সংজ্ঞায়িত করি যা একটি ট্রি নোডকে প্রতিনিধিত্ব করবে যেখানে ডেটা এবং এর বাম এবং ডান নোড চাইল্ড রয়েছে। যদি এটি তৈরি করা প্রথম নোড হয় তবে এটি একটি রুট নোড অন্যথায় একটি চাইল্ড নোড।

struct Node {
   int data;
   struct Node *leftChild, *rightChild;
};

এরপরে আমরা আমাদের newNode(int data) ফাংশন তৈরি করি যা একটি int মান নেয় এবং নোডের ডেটা মেম্বারকে বরাদ্দ করি। ফাংশনটি তৈরি করা স্ট্রাকট নোডে পয়েন্টার ফিরিয়ে দেয়। এছাড়াও, নতুন তৈরি নোডের বাম এবং ডান চাইল্ড নাল সেট করা হয়েছে৷

struct Node* newNode(int data) {
   struct Node* newNode = new Node;
   newNode->data = data;
   newNode->leftChild = newNode->rightChild = NULL;
   return (newNode);
}

এখন আমরা ডিলিট নোড (নোড* রুট, int k) ফাংশন তৈরি করি যা রুট নোড এবং নোডের ডেটা মান মুছে ফেলতে নেয়। যদি প্রদত্ত নোডটি একটি প্যারেন্ট নোড হয় তবে এটি তার বাম এবং ডান সন্তানকেও মুছে দেয়। ফাংশন প্রদত্ত নোড মুছে ফেলার পরে পরিবর্তিত রুট নোড ফেরত দেয়।

Node* deleteLeafNode(Node* root, int k) {
   if (root == NULL)
      return nullptr;
   root->leftChild = deleteLeafNode(root->leftChild, k);
   root->rightChild = deleteLeafNode(root->rightChild, k);
   if (root->data == k && root->leftChild == NULL &&
      root->rightChild == NULL)
      return nullptr;
   return root;
}

অবশেষে ডিলিট করার পর ট্রি ডিসপে করার জন্য আমাদের কাছে একটি ফাংশন ইনঅর্ডার (নোড* রুট) আছে যা ইনঅর্ডার ফাংশনে ট্রিকে অতিক্রম করে।

void inorder(Node* root){
   if (root != NULL){
      inorder(root->leftChild);
      inorder(root->rightChild);
      cout << root->data << " ";
   }
}

উদাহরণ

আসুন k মান আছে এমন লিফ নোডগুলি মুছে ফেলার নিম্নলিখিত বাস্তবায়ন দেখি।

#include <iostream>
using namespace std;
struct Node {
   int data;
   struct Node *leftChild, *rightChild;
};
struct Node* newNode(int data){
   struct Node* newNode = new Node;
   newNode->data = data;
   newNode->leftChild = newNode->rightChild = NULL;
   return (newNode);
}
Node* deleteLeafNode(Node* root, int k){
   if (root == NULL)
      return nullptr;
   root->leftChild = deleteLeafNode(root->leftChild, k);
   root->rightChild = deleteLeafNode(root->rightChild, k);
   if (root->data == k && root->leftChild == NULL &&
   root->rightChild == NULL)
      return nullptr;
   return root;
}
void inorder(Node* root){
   if (root != NULL){
      inorder(root->leftChild);
      inorder(root->rightChild);
      cout << root->data << " ";
   }
}
int main(void){
   struct Node* root = newNode(6);
   root->leftChild = newNode(7);
   root->rightChild = newNode(7);
   root->leftChild->leftChild = newNode(5);
   root->leftChild->rightChild = newNode(3);
   root->rightChild->rightChild = newNode(7);
   deleteLeafNode(root, 7);
   cout << "Inorder traversal after deleting given leaf node: ";
   inorder(root);
   return 0;
}

আউটপুট

উপরের কোডটি নিম্নলিখিত আউটপুট −

তৈরি করবে
Inorder traversal after deleting given leaf node: 5 3 7 6

  1. C++ এ BST-তে নোড মুছুন

  2. C++ এ একটি লিফ নোড থেকে k দূরত্বে থাকা সমস্ত নোড প্রিন্ট করুন

  3. C++ এ বাইনারি সার্চ ট্রিতে ন্যূনতম মান সহ নোড খুঁজুন

  4. নোড খুঁজুন যার পরম পার্থক্য X-এর সাথে C++ এ সর্বোচ্চ মান দেয়