题意:Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
题解:因为BST中序遍历(左中右)的结果肯定组成一个上升序列。
如:1,2,3,4,5,6.
所以若节点有交换,则肯定有逆序对的存在。
如:1,5,3,4,2,6.
上例有两个相邻的逆序对,则第一个逆序对的大值和第二个逆序对的小值就是我们要求的节点。注意也可能只有一个逆序对。
代码如下:
class Solution {
public:
void searchTree(TreeNode* root, TreeNode*& pre, TreeNode*& first, TreeNode*& second) {
//pre使用引用的指针,以保持一个全局变量代表中序遍历的上一个节点
if(!root) return;
searchTree(root->left, pre, first, second);
if(root->val < pre->val) {
if(!first) {
//第一次遇到的较大值得节点
first = pre;
}
second = root;
}
pre = root;
searchTree(root->right, pre, first, second);
return;
}
void recoverTree(TreeNode* root) {
TreeNode* pre = new TreeNode(INT_MIN);
TreeNode* first(0);
TreeNode* second(0);
searchTree(root, pre, first, second);
swap(first->val, second->val);
return;
}
};