原题:
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 两个挨着的节点换了,导致前一个比后一个的值大
2 两个不挨着的换了,导致有两组,每组都是前一个比后一个大,但是这两种情况不同:
中序遍历时,第一次遇到的这个组,前一个比后一个大,说明这个大的是错误的;第二次遇到时,说明小的是错误的,如图:
解决方法:
用两个指针first和second用来标识这两个被错误交换的节点,又由于在程序中需要经常比前一个和后一个,因此用一个pre指针指向前一个节点(中序列)。由于在遍历时,可能有一组或者两组上述的情况,因此在遇到第一组时,就让first=pre , second = root;就避免了判断是否是两个相邻指针的问题。
代码(328ms):class Solution {
public:
TreeNode * first;
TreeNode * second;
TreeNode * pre;
void recoverTree(TreeNode *root) {
inOrder(root);
int temp = first->val;
first->val = second->val;
second->val = temp;
}
void inOrder(TreeNode * &root){
if(!root) return;
if(root->left){
inOrder(root->left);
}
if( pre &&(pre->val > root->val)){
if(!first){
first = pre;
second = root;
}
else
second = root;
}
pre = root;
if(root->right){
inOrder(root->right);
}
}
};