Leetcode-99. 恢复二叉搜索树

二叉搜索树中的两个节点被错误地交换。

请在不改变其结构的情况下,恢复这棵树。

进阶:

  • 使用 O(n) 空间复杂度的解法很容易实现。
  • 你能想出一个只使用常数空间的解决方案吗?

题目链接:https://leetcode-cn.com/problems/recover-binary-search-tree/

解法1:递归

与98题同样的思路

对二叉搜索树采用中序遍历,找到两个不符合规范的节点,然后交换他们的数值

进阶:

要求用常数的空间,我们用pre指针来存父节点,比较pre和当前指针的大小我们就能找到这两个错误的节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:

TreeNode *left=new TreeNode(INT_MIN);
TreeNode *right=new TreeNode(INT_MIN);
TreeNode *pre=new TreeNode(INT_MIN);
public:
void recoverTree(TreeNode* root) {
midbfs(root);
swap(left->val,right->val);
return ;
}
void midbfs(TreeNode *root)
{
if(root!=NULL)
{
midbfs(root->left);
if(left->val==INT_MIN&&pre->val>root->val)
{
left=pre;
}
if(pre->val>root->val)
{
right=root;
}
pre=root;
midbfs(root->right);
}
}
};