99. Recover Binary Search Tree
题目要求我们使用原地算法,也就是不使用额外的空间O(1), 仔细想了下倒是可以利用多次循环判断是否属于搜索树,不属于时候交换两个节点的值,知道形成一棵符合要求的搜索树。具体代码如下:
class Solution {
public:
void recoverTree(TreeNode* root) {
TreeNode* pre = nullptr;
bool res = false;
while (!res)
{
res = true;
pre = nullptr;
recoverTree(root, pre, res);
}
}
private:
void recoverTree(TreeNode* node, TreeNode*& prev, bool& res)
{
if (node == nullptr)
return;
recoverTree(node->left, prev, res);
if (prev != nullptr && node->val <= prev->val)
{
res = false;
swap(node->val, prev->val);
return;
}
prev = node;
recoverTree(node->right, prev, res);
}
};
代码优化不是很好,所以时间开销很大,但是应该是O(1)空间复杂度。