题目描述
给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。
样例描述
思路
中序遍历 + 降序对判断
核心思路:直接找错误的两个结点node1和node2进行交换,中序遍历过程中记录当前结点的前一个结点pre。
- 错误类型就两种:一种是相邻的逆序对,直接找到两个交换即可。另一种是有多个逆序对,要找到第一次逆序对的前一个结点为node1,最后一次逆序对的后一个结点为node2,交换这两结点就行。
- 综合上面两种错误类型,可以知道前一次和最后一次可能为同一次,所以在判断node1的时候注意是否已经出现过。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
*