// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
// Class that represents a node of the tree
class Node {
public:
int data;
Node* left, * right;
// Constructor to create a new tree node
Node(int key)
{
data = key;
left = right = nullptr;
}
};
class GFG {
public:
static int mergeSort(int* arr, int array_size);
static int _mergeSort(int* arr, int* temp, int left, int right);
static int merge(int* arr, int* temp, int left, int mid, int right);
static void Inorder(Node* node);
static int pairsViolatingBST(Node* root, int N);
};
// This method sorts the input array and returns the
// number of inversions in the array
int GFG::mergeSort(int* arr, int array_size)
{
int* temp = new int[array_size];
return _mergeSort(arr, temp, 0, array_size - 1);
}
// An auxiliary recursive method that sorts
// the input array and returns the number of
// inversions in the array
int GFG::_mergeSort(int* arr, int* temp, int left, int right)
{
int mid, inv_count = 0;
if (right > left) {
// Divide the array into two parts and
// call _mergeSortAndCountInv() for each
// of the parts
mid = (right + left) / 2;
// Inversion count will be sum of inversions
// in left-part, right-part and number of
// inversions in merging
inv_count = _mergeSort(arr, temp, left, mid);
inv_count += _mergeSort(arr, temp, mid + 1, right);
// Merge the two parts
inv_count += merge(arr, temp, left, mid + 1, right);
}
return inv_count;
}
// This method merges two sorted arrays and returns
// inversion count in the arrays
int GFG::merge(int* arr, int* temp, int left, int mid, int right)
{
int i, j, k;
int inv_count = 0;
// i is index for left subarray
i = left;
// j is index for right subarray
j = mid;
// k is index for resultant merged subarray
k = left;
while ((i <= mid - 1) && (j <= right)) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
}
else {
temp[k++] = arr[j++];
inv_count = inv_count + (mid - i);
}
}
// Copy the remaining elements of right subarray
// if there are any) to temp
while (i <= mid - 1)
temp[k++] = arr[i++];
// Copy the remaining elements of right subarray
// if there are any) to temp
while (j <= right)
temp[k++] = arr[j++];
// Copy back the merged elements to original array
for (i = left; i <= right; i++)
arr[i] = temp[i];
return inv_count;
}
// Array to store
// inorder traversal of the binary tree
int* a;
int i;
// Inorder traversal of the binary tree
void GFG::Inorder(Node* node)
{
if (node == nullptr)
return;
Inorder(node->left);
a[i++] = node->data;
Inorder(node->right);
}
// Function to count the pairs
// in a binary tree violating BST property
int GFG::pairsViolatingBST(Node* root, int N)
{
if (root == nullptr)
return 0;
i = 0;
a = new int[N];
Inorder(root);
// Total inversions in the array
int inversionCount = mergeSort(a, N);
return inversionCount;
}
// Driver Code
int main()
{
int N = 7;
Node* root = new Node(50);
root->left = new Node(30);
root->right = new Node(60);
root->left->left = new Node(20);
root->left->right = new Node(25);
root->right->left = new Node(10);
root->right->right = new Node(40);
cout << GFG::pairsViolatingBST(root, N) << endl;
return 0;
}
// This code is contributed by codebraxnzt