99. 恢复二叉搜索树(一般)

给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。

进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?

示例 1:

输入:root = [1,3,null,null,2]
输出:[3,1,null,null,2]
解释:3 不能是 1 左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。

示例 2:

输入:root = [3,1,4,null,null,2]
输出:[2,1,4,null,null,3]
解释:2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。

提示:

树上节点的数目在范围 [2, 1000] 内
-231= Node.val <= 231sup> - 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recover-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路1:

中序遍历,判断如果有序就是正确的,但是这一题有点懵,主函数没有返回值,第一次写准备交换节点,但是不允许,只能交换节点值

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution {
List<TreeNode> list = new ArrayList<>();
public void recoverTree(TreeNode root) {
//遍历
inorder(root);
TreeNode tmp1 = null;
TreeNode tmp2 = null;
for(int i=0;i<list.size()-1;i++){
//找出有问题的节点
if(list.get(i).val>list.get(i+1).val){
tmp2 = list.get(i+1);
if(tmp1==null){
tmp1 = list.get(i);
}
}

}
//交换值,但不交换节点
if(tmp1!=null && tmp2!=null){
int val = tmp1.val;
tmp1.val = tmp2.val;
tmp2.val = val;
}
}
//中序遍历,肯定有序,如果没有序,表示有问题
public void inorder(TreeNode root){
if(root== null){
return;
}
inorder(root.left);
list.add(root);
inorder(root.right);
}

}