• Source
    1. BstNode* maxValueNode(BstNode* node)
    2. {
    3. BstNode* current = node;
    4.  
    5. /* সবচেয়ে রাইটে যে আছে সেটিই সবচেয়ে বড় */
    6.  
    7. while (current->right != NULL)
    8. current = current->right;
    9.  
    10. return current;
    11. }
    12.  
    13. BstNode* deleteNode(BstNode* root, int key)
    14. {
    15. /* বেস কেস */
    16.  
    17. if (root == NULL)
    18. {
    19. return root;
    20. }
    21.  
    22. /* যে ডাটাটি ডিলিট করবো তা রুটের ভ্যালু থেকে ছোট হলে সেটি রুটের লেফট সাবট্রিতে আছে */
    23.  
    24. if (key < root->data)
    25. {
    26. root->left = deleteNode(root->left, key);
    27. }
    28.  
    29. /* যে ডাটাটি ডিলিট করবো তা রুটের ভ্যালু থেকে বড় হলে সেটি রুটের রাইট সাবট্রিতে আছে */
    30.  
    31. else if (key > root->data)
    32. {
    33. root->right = deleteNode(root->right, key);
    34. }
    35.  
    36. /* ডাটাটি রুটের ভ্যালুর সমান হলে এটিই সেই ডাটা যেটি আমরা ডিলিট করতে চাচ্ছি */
    37.  
    38. else
    39. {
    40. /* নোডের যদি চাইল্ড না থাকে বা একটি চাইল্ড থাকে */
    41.  
    42. if (root->left == NULL)
    43. {
    44. BstNode* temp = root->right;
    45. free(root);
    46. return temp;
    47. }
    48. else if (root->right == NULL)
    49. {
    50. BstNode* temp = root->left;
    51. free(root);
    52. return temp;
    53. }
    54.  
    55. /* নোডের দুটি চাইল্ড থাকলে তার লেফট সাবট্রিয়ের সবচেয়ে বড় ভ্যালুকে আমরা খুঁজে বের করবো
    56.   অথবা রাইট সাবট্রিয়ের সবচেয়ে ছোট ভ্যালুকে আমরা খুঁজে বের করবো
    57.   এখানে আমরা লেফট সাবট্রিতে সার্চ দিয়েছি */
    58.  
    59. BstNode* temp = maxValueNode(root->left);
    60.  
    61. /* লেফট সাবট্রিয়ের সবচেয়ে বড় ভ্যালুই এখন আমাদের রুট হবে */
    62.  
    63. root->data = temp->data;
    64.  
    65. /* লেফট সাবট্রিয়ের সবচেয়ে বড় ভ্যালুটি যেহেতু আমাদের রুটে নিয়ে এসেছি
    66.   তাই যেখান থেকে ভ্যালুটি এনেছি সেটিকে ডিলিট করে দেবো */
    67.  
    68. root->left = deleteNode(root->left, temp->data);
    69. }
    70.  
    71. return root;
    72. }