Leetcode: Recover Binary Search Tree
题目
Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Note:
A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?
confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.
思路:
1. A solution using O(n) space is pretty straight forward, 指的是中序遍历
2. 依然使用中序遍历, 但只需要维持大小为 2 的窗口即可
3. 具体来讲, 因为 BST 的中序遍历是一个递增的数组, 我们可以通过分析递增数组交换两个元素后的情况来进行编码, 当数组中连续的两个数交换时, 只会出现一次逆序, 否则, 必然恰好两次逆序, 所以, 我们设置一个 candidate[2] 来存储第一次逆序的两个节点. 假如发现了第二次逆序, 那么直接找到了, 若没发现第二次逆序, 那么必然是连续的两个数交换, candidate 中存储的两个节点就是答案
代码:
class Solution {
public:
TreeNode* candidate[2];
TreeNode* pre;
bool findone;
bool ans;
void recoverTree(TreeNode *root) {
if(root == NULL)
return;
ans = false;
findone = false;
pre = NULL;
inorder(root);
if(ans)
return;
else{
int tmp = candidate[0]->val;
candidate[0]->val = candidate[1]->val;
candidate[1]->val = tmp;
}
// just for fun
return;
}
void inorder(TreeNode *root) {
if(root == NULL)
return;
if(root->left != NULL && !ans)
inorder(root->left);
if(pre == NULL)
pre = root;
if(root->val < pre->val ) { // findone
if(findone) { // 找到另一个
int tmp = candidate[0]->val;
candidate[0]->val = root->val;
root->val = tmp;
ans = true;
}else{
candidate[0] = pre;
candidate[1] = root;
findone = true;
}
}
pre = root;
if(root->right &&!ans)
inorder(root->right);
}
};

浙公网安备 33010602011771号