Recover Binary Search Tree
You are given the root
of a binary search tree (BST), where the values of exactly two nodes of the tree were swapped by mistake. Recover the tree without changing its structure.
Solution
This is a hard problem to visualize and comeup with a solution if you look frm a graph standpoint. However, if you look at it from a list standpoint, it becomes much easier to visualize and come up with a solution.
Lets take this example list: [1, 6, 3, 4, 5, 2, 7]
. THe algorithm involves iterating each element in the list, making note of the first element that is out of place. In this case, it is 6
. Then, we iterate the list again, making note of the last element that is out of place. In this case, it is 2
. Finally, we swap the two elements.
Map this to a BST, and you will see that the algorithm works.
var recoverTree = function(root) {
var prev = null; // Previous node during inorder traversal
var first = null; // First misplaced node
var second = null; // Second misplaced node
var inorderTraversal = function(node) {
if (node === null) {
return;
}
// Traverse the left subtree
inorderTraversal(node.left);
// Visit the current node
if (prev !== null && prev.val > node.val) {
if (first === null) {
first = prev;
}
second = node;
}
prev = node;
// Traverse the right subtree
inorderTraversal(node.right);
};
// Perform the in-order traversal to identify the misplaced nodes
inorderTraversal(root);
// Swap the values of the misplaced nodes
var temp = first.val;
first.val = second.val;
second.val = temp;
};