#include <bits/stdc++.h>
using
namespace
std;
struct
node {
int
data;
node *left, *right;
};
node* newnode(
int
data)
{
node* temp =
new
node;
temp->data = data;
temp->left = temp->right = NULL;
return
temp;
}
void
printTree(node* root)
{
if
(!root)
return
;
queue<node*> q;
q.push(root);
while
(!q.empty()) {
int
n = q.size();
while
(n--) {
node* temp = q.front();
q.pop();
cout << temp->data <<
" "
;
if
(temp->left)
q.push(temp->left);
if
(temp->right)
q.push(temp->right);
}
cout << endl;
}
}
void
BT2DLL(node* root, node*& head)
{
if
(root == NULL)
return
;
static
node* left = NULL;
BT2DLL(root->left, head);
if
(left == NULL)
head = root;
else
{
root->left = left;
left->right = root;
}
left = root;
BT2DLL(root->right, head);
}
void
deletenode(node*& head, node* del)
{
if
(head == NULL || del == NULL)
return
;
if
(head == del)
head = del->right;
if
(del->right != NULL)
del->right->left = del->left;
if
(del->left != NULL)
del->left->right = del->right;
free
(del);
}
void
removeKeys(node*& head,
int
k)
{
if
(head == NULL)
return
;
node* current = head;
node* right;
while
(current != NULL) {
if
(current->data % k == 0) {
right = current->right;
deletenode(head, current);
current = right;
}
else
current = current->right;
}
}
node* DLLtoBT(node*& head,
int
n)
{
if
(n <= 0)
return
NULL;
node* left = DLLtoBT(head, n / 2);
node* root = head;
root->left = left;
head = head->right;
root->right = DLLtoBT(head, n - n / 2 - 1);
return
root;
}
node* removeMultiplesUtil(node* root,
int
k)
{
node* head = NULL;
BT2DLL(root, head);
removeKeys(head, k);
node* temp = head;
int
n = 0;
while
(temp) {
++n;
temp = temp->right;
}
return
DLLtoBT(head, n);
}
void
removeMultiples(node*& root,
int
k)
{
if
(!root)
return
;
root = removeMultiplesUtil(root, k);
}
int
main()
{
int
k = 2;
node* root = newnode(1);
root->left = newnode(2);
root->right = newnode(3);
root->left->left = newnode(4);
root->left->right = newnode(5);
root->left->left->left = newnode(6);
root->left->left->right = newnode(7);
root->right->left = newnode(8);
root->right->left->left = newnode(9);
cout <<
"Level Order Traversal of Given Binary Tree:\n"
;
printTree(root);
removeMultiples(root, k);
cout <<
"\nLevel Order Traversal of Updated Binary "
"Tree:\n"
;
printTree(root);
return
0;
}