// This function does inorder traversal to find out the two swapped nodes.
// It sets three pointers, first, middle and last. If the swapped nodes are
// adjacent to each other, then first and middle contain the resultant nodes
// Else, first and last contain the resultant nodes
void correctBSTUtil( struct node* root, struct node** first,
struct node** middle, struct node** last,
struct node** prev )
{
if( root )
{
// Recur for the left subtree
correctBSTUtil( root->left, first, middle, last, prev );
// If this node is smaller than the previous node, it's violating
// the BST rule.
if (*prev && root->data < (*prev)->data)
{
// If this is first violation, mark these two nodes as
// 'first' and 'middle'
if ( !*first )
{
*first = *prev;
*middle = root;
}
// If this is second violation, mark this node as last
else
*last = root;
}
// Mark this node as previous
*prev = root;
// Recur for the right subtree
correctBSTUtil( root->right, first, middle, last, prev );
}
}
// A function to fix a given BST where two nodes are swapped. This
// function uses correctBSTUtil() to find out two nodes and swaps the
// nodes to fix the BST
void correctBST( struct node* root )
{
// Initialize pointers needed for correctBSTUtil()
struct node *first, *middle, *last, *prev;
first = middle = last = prev = NULL;
// Set the poiters to find out two nodes
correctBSTUtil( root, &first, &middle, &last, &prev );
// Fix (or correct) the tree
if( first && last )
swap( &(first->data), &(last->data) );
else if( first && middle ) // Adjacent nodes swapped
swap( &(first->data), &(middle->data) );
// else nodes have not been swapped, passed tree is really BST.
}
Ci8vIFRoaXMgZnVuY3Rpb24gZG9lcyBpbm9yZGVyIHRyYXZlcnNhbCB0byBmaW5kIG91dCB0aGUgdHdvIHN3YXBwZWQgbm9kZXMuIAovLyBJdCBzZXRzIHRocmVlIHBvaW50ZXJzLCBmaXJzdCwgbWlkZGxlIGFuZCBsYXN0LiAgSWYgdGhlIHN3YXBwZWQgbm9kZXMgYXJlIAovLyBhZGphY2VudCB0byBlYWNoIG90aGVyLCB0aGVuIGZpcnN0IGFuZCBtaWRkbGUgY29udGFpbiB0aGUgcmVzdWx0YW50IG5vZGVzIAovLyBFbHNlLCBmaXJzdCBhbmQgbGFzdCBjb250YWluIHRoZSByZXN1bHRhbnQgbm9kZXMgCnZvaWQgY29ycmVjdEJTVFV0aWwoIHN0cnVjdCBub2RlKiByb290LCBzdHJ1Y3Qgbm9kZSoqIGZpcnN0LCAKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5vZGUqKiBtaWRkbGUsIHN0cnVjdCBub2RlKiogbGFzdCwgCiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBub2RlKiogcHJldiApIAp7IAogICAgaWYoIHJvb3QgKSAKICAgIHsgCiAgICAgICAgLy8gUmVjdXIgZm9yIHRoZSBsZWZ0IHN1YnRyZWUgCiAgICAgICAgY29ycmVjdEJTVFV0aWwoIHJvb3QtPmxlZnQsIGZpcnN0LCBtaWRkbGUsIGxhc3QsIHByZXYgKTsgCiAgCiAgICAgICAgLy8gSWYgdGhpcyBub2RlIGlzIHNtYWxsZXIgdGhhbiB0aGUgcHJldmlvdXMgbm9kZSwgaXQncyB2aW9sYXRpbmcgCiAgICAgICAgLy8gdGhlIEJTVCBydWxlLiAKICAgICAgICBpZiAoKnByZXYgJiYgcm9vdC0+ZGF0YSA8ICgqcHJldiktPmRhdGEpIAogICAgICAgIHsgCiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgZmlyc3QgdmlvbGF0aW9uLCBtYXJrIHRoZXNlIHR3byBub2RlcyBhcyAKICAgICAgICAgICAgLy8gJ2ZpcnN0JyBhbmQgJ21pZGRsZScgCiAgICAgICAgICAgIGlmICggISpmaXJzdCApIAogICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgKmZpcnN0ID0gKnByZXY7IAogICAgICAgICAgICAgICAgKm1pZGRsZSA9IHJvb3Q7IAogICAgICAgICAgICB9IAogIAogICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHNlY29uZCB2aW9sYXRpb24sIG1hcmsgdGhpcyBub2RlIGFzIGxhc3QgCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICpsYXN0ID0gcm9vdDsgCiAgICAgICAgfSAKICAKICAgICAgICAvLyBNYXJrIHRoaXMgbm9kZSBhcyBwcmV2aW91cyAKICAgICAgICAqcHJldiA9IHJvb3Q7IAogIAogICAgICAgIC8vIFJlY3VyIGZvciB0aGUgcmlnaHQgc3VidHJlZSAKICAgICAgICBjb3JyZWN0QlNUVXRpbCggcm9vdC0+cmlnaHQsIGZpcnN0LCBtaWRkbGUsIGxhc3QsIHByZXYgKTsgCiAgICB9IAp9IAogIAovLyBBIGZ1bmN0aW9uIHRvIGZpeCBhIGdpdmVuIEJTVCB3aGVyZSB0d28gbm9kZXMgYXJlIHN3YXBwZWQuICBUaGlzIAovLyBmdW5jdGlvbiB1c2VzIGNvcnJlY3RCU1RVdGlsKCkgdG8gZmluZCBvdXQgdHdvIG5vZGVzIGFuZCBzd2FwcyB0aGUgCi8vIG5vZGVzIHRvIGZpeCB0aGUgQlNUIAp2b2lkIGNvcnJlY3RCU1QoIHN0cnVjdCBub2RlKiByb290ICkgCnsgCiAgICAvLyBJbml0aWFsaXplIHBvaW50ZXJzIG5lZWRlZCBmb3IgY29ycmVjdEJTVFV0aWwoKSAKICAgIHN0cnVjdCBub2RlICpmaXJzdCwgKm1pZGRsZSwgKmxhc3QsICpwcmV2OyAKICAgIGZpcnN0ID0gbWlkZGxlID0gbGFzdCA9IHByZXYgPSBOVUxMOyAKICAKICAgIC8vIFNldCB0aGUgcG9pdGVycyB0byBmaW5kIG91dCB0d28gbm9kZXMgCiAgICBjb3JyZWN0QlNUVXRpbCggcm9vdCwgJmZpcnN0LCAmbWlkZGxlLCAmbGFzdCwgJnByZXYgKTsgCiAgCiAgICAvLyBGaXggKG9yIGNvcnJlY3QpIHRoZSB0cmVlIAogICAgaWYoIGZpcnN0ICYmIGxhc3QgKSAKICAgICAgICBzd2FwKCAmKGZpcnN0LT5kYXRhKSwgJihsYXN0LT5kYXRhKSApOyAKICAgIGVsc2UgaWYoIGZpcnN0ICYmIG1pZGRsZSApIC8vIEFkamFjZW50IG5vZGVzIHN3YXBwZWQgCiAgICAgICAgc3dhcCggJihmaXJzdC0+ZGF0YSksICYobWlkZGxlLT5kYXRhKSApOyAKICAKICAgIC8vIGVsc2Ugbm9kZXMgaGF2ZSBub3QgYmVlbiBzd2FwcGVkLCBwYXNzZWQgdHJlZSBpcyByZWFsbHkgQlNULiAKfSA=
prog.cpp: In function ‘void correctBSTUtil(node*, node**, node**, node**, node**)’:
prog.cpp:13:29: error: invalid use of incomplete type ‘struct node’
correctBSTUtil( root->left, first, middle, last, prev );
^~
prog.cpp:6:29: note: forward declaration of ‘struct node’
void correctBSTUtil( struct node* root, struct node** first,
^~~~
prog.cpp:17:26: error: invalid use of incomplete type ‘struct node’
if (*prev && root->data < (*prev)->data)
^~
prog.cpp:6:29: note: forward declaration of ‘struct node’
void correctBSTUtil( struct node* root, struct node** first,
^~~~
prog.cpp:17:42: error: invalid use of incomplete type ‘struct node’
if (*prev && root->data < (*prev)->data)
^~
prog.cpp:6:29: note: forward declaration of ‘struct node’
void correctBSTUtil( struct node* root, struct node** first,
^~~~
prog.cpp:36:29: error: invalid use of incomplete type ‘struct node’
correctBSTUtil( root->right, first, middle, last, prev );
^~
prog.cpp:6:29: note: forward declaration of ‘struct node’
void correctBSTUtil( struct node* root, struct node** first,
^~~~
prog.cpp: In function ‘void correctBST(node*)’:
prog.cpp:47:36: error: ‘NULL’ was not declared in this scope
first = middle = last = prev = NULL;
^~~~
prog.cpp:47:36: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
prog.cpp:1:1:
+#include <cstddef>
prog.cpp:47:36:
first = middle = last = prev = NULL;
^~~~
prog.cpp:54:22: error: invalid use of incomplete type ‘struct node’
swap( &(first->data), &(last->data) );
^~
prog.cpp:6:29: note: forward declaration of ‘struct node’
void correctBSTUtil( struct node* root, struct node** first,
^~~~
prog.cpp:54:37: error: invalid use of incomplete type ‘struct node’
swap( &(first->data), &(last->data) );
^~
prog.cpp:6:29: note: forward declaration of ‘struct node’
void correctBSTUtil( struct node* root, struct node** first,
^~~~
prog.cpp:54:9: error: ‘swap’ was not declared in this scope
swap( &(first->data), &(last->data) );
^~~~
prog.cpp:56:22: error: invalid use of incomplete type ‘struct node’
swap( &(first->data), &(middle->data) );
^~
prog.cpp:6:29: note: forward declaration of ‘struct node’
void correctBSTUtil( struct node* root, struct node** first,
^~~~
prog.cpp:56:39: error: invalid use of incomplete type ‘struct node’
swap( &(first->data), &(middle->data) );
^~
prog.cpp:6:29: note: forward declaration of ‘struct node’
void correctBSTUtil( struct node* root, struct node** first,
^~~~
prog.cpp:56:9: error: ‘swap’ was not declared in this scope
swap( &(first->data), &(middle->data) );
^~~~