딱 한쌍의 노드를 swap해야 정상적인 BST가 되는 트리가 주어진다. 이 트리를 BST로 고쳐라.
if (n1 == NULL) n1 = prev;
부분). 그 뒤 계속 순회를 하면서 target 1과 비교해서 정렬이 마지막으로 어긋나는 노드를 target2 로 선정. 5-2-3-4-1
4-2-3-1
5-3-1
1-3-2-4
이런 종류만 트리의 입력으로 들어올 수 있음. 정렬---(target1)---정렬----(target2)---정렬
(정렬 지점은 없을수도 있음)
struct TreeNode *n1 = NULL, *n2 = NULL, *prev = NULL;
void inorder(struct TreeNode* root)
{
if (root == NULL)
return;
inorder(root->left);
//printf("%d ", root->val);
if (prev && root->val < prev->val) {
n2 = root; // search the final target 2
if (n1 == NULL) n1 = prev; // fix the target 1
else return;
}
prev = root;
inorder(root->right);
return;
}
void swap(struct TreeNode* a, struct TreeNode* b)
{
if (!a || !b)
fprintf(stderr, "failed to find targets\n");
int tmp = a->val;
a->val = b->val;
b->val = tmp;
}
void recoverTree(struct TreeNode* root){
n1 = NULL, n2 = NULL, prev = NULL;
inorder(root);
swap(n1, n2);
return;
}