这道题难点,是找到那两个交换节点,把它交换过来就行了。
这里我们二叉树搜索树的中序遍历(中序遍历遍历元素是递增的)
class Solution {
TreeNode firstNode = null;
TreeNode secondNode = null;
TreeNode preNode = new TreeNode(Integer.MIN_VALUE);
public void recoverTree(TreeNode root) {
in_order(root);
int tmp = firstNode.val;
firstNode.val = secondNode.val;
secondNode.val = tmp;
}
private void in_order(TreeNode root) { //中序遍历
if (root == null) return;
in_order(root.left);
//中序遍历框架,这里开始访问节点内容并做处理
if (firstNode == null && preNode.val > root.val) firstNode = preNode;
if (firstNode != null && preNode.val > root.val) secondNode = root;
preNode = root; //当前访问节点
//结束处理
in_order(root.right);
}
}