题目:
二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
思路:
中序遍历。
保存前一个节点。
当前一个节点大于当前节点,说明错误发生,记录前一个节点值
当第一个节点被记录后,继续递归,找到最后一个该情况,记录当前节点值。
交换两个节点
代码:
class Solution {
TreeNode firstNode = null;
TreeNode secondNode = null;
TreeNode pre = new TreeNode(Integer.MIN_VALUE);
public void recoverTree(TreeNode root) {
inOrder(root);
int temp = firstNode.val;
firstNode.val = secondNode.val;
secondNode.val = temp;
}
private void inOrder(TreeNode node) {
if (node == null) return;
inOrder(node.left);
if(firstNode == null && pre.val > node.val) firstNode = pre;
if(firstNode != null && pre.val > node.val) secondNode = node;
pre = node;
inOrder(node.right);
}
}