恢复二叉搜索树。二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例 1:
1 |
|
示例 2:
1 |
|
进阶:
- 使用 O(n) 空间复杂度的解法很容易实现。
- 你能想出一个只使用常数空间的解决方案吗?
1 |
|
思路一
通过中序遍历解决。中序遍历的一般形式如下:
1 |
|
如果要打印输出二叉树,直接替换注释部分为打印输出即可。这里我们需要找到两个交换的结点,假设下面的例子是中序输出的结果:
1 |
|
比较每一个结点和它后面的结点,可以发现 6 是第一个需要交换的结点,因为 6 > 3,并且 2 是第二个需要交换的结点,因为 2 < 5。实际上我们比较的是当前结点与前一个结点值的大小。
因此,使用 pre
保存前一个结点,找到 first_node
和 second_node
,然后将他们交换。
1 |
|
时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。
思路二
对思路一,通过循环实现。
1 |
|
时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。
思路三
Morris 遍历法。即将中序遍历时代码中输出打印的部分改为寻找两个结点,代码如下:
1 |
|
时间复杂度 \(O(n)\),空间复杂度 \(O(1)\)。