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:
先看一个递增序列:1 2 3 4 5 6 7.
交换4和6:1 2 3 6 5 4 7
注意,6是第一个大于后一个元素的(6 > 5, 5 > 4),4是最后一个小于前一个元素的(5 < 6,4 < 5)。
提示2:
不用O(n)空间来记录整个序列,根据提示1,只记录前一个节点即可。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
TreeNode *node1, *node2;
TreeNode *pre;
void traverse(TreeNode *root) {
if (root == NULL) {
return;
}
traverse(root->left);
if (pre != NULL && pre->val > root->val) {
node2 = root;
if (node1 == NULL) {
node1 = pre;
}
}
pre = root;
traverse(root->right);
}
public:
void recoverTree(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
node1 = node2 = NULL;
pre = NULL;
traverse(root);
node1->val ^= node2->val;
node2->val ^= node1->val;
node1->val ^= node2->val;
}
};