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?
这道题和98. Validate Binary Search Tree是同样的思路,采用中序遍历,题目中提到不要用空间复杂度为O(n),也就是不要用list来保存遍历的结果再去找,和上一题一样使用pre来记录位置。
需要注意的是当是两个相连的位置交换后,则只会找出一处位置错误的。
这道题开始的时候进入了一个误区是,我想的是要交换两个节点,而不是交换节点的值,mygod!
public class Solution {
TreeNode t1, t2;;
TreeNode pre;
void recursiveTraversal(TreeNode root) {
if(root==null) {
return;
}
if(root.left!=null) {
recursiveTraversal(root.left);
}
if(pre!=null&&root.val<pre.val) {
if(t1==null) {
t1 = pre;
t2 = root;
} else {
t2 = root;
}
}
pre = root;
if(root.right!=null) {
recursiveTraversal(root.right);
}
}
public void recoverTree(TreeNode root) {
recursiveTraversal(root);
if(t1!=null&&t2!=null) {
int tmp = t1.val;
t1.val = t2.val;
t2.val = tmp;
}
}
}