Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
对树不熟悉,不过只有一个节点有问题。如:
123456
123654
交换6和4,654是这个不规则的地方。
因为只有一个地方不规则,且这个地方必定是逆序的。所以第一个数必定是大数,最后一个是最小的。(证明:从略。其实是不会。。。)
/**
* 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 *large;
TreeNode *small;
TreeNode *lastleft;
void recovering(TreeNode *root) {
if(root == NULL) return;
recovering(root->left);
if(lastleft != NULL && lastleft->val > root->val) {
small = root;
if(large == NULL) {
large = lastleft;
}
}
lastleft = root;
recovering(root->right);
}
public:
void recoverTree(TreeNode *root) {
large = NULL;
small = NULL;
lastleft = NULL;
recovering(root);
large->val ^= small->val;
small->val ^= large->val;
large->val ^= small->val;
}
};