问题描述

二叉搜索树中的两个节点被错误地交换。

请在不改变其结构的情况下,恢复这棵树。

示例 1:

输入: [1,3,null,null,2]

  1
  /
 3
  \
  2

输出: [3,1,null,null,2]

  3
  /
 1
  \
  2
示例 2:

输入: [3,1,4,null,null,2]

3
/ \
1 4
  /
  2

输出: [2,1,4,null,null,3]

2
/ \
1 4
  /
 3
进阶:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recover-binary-search-tree

解答

/**
 * 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) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
//中序遍历,将每一个node保存到list里面,然后对list中的逆序的node的值交换。
class Solution {
    List<TreeNode> list;
    public void recoverTree(TreeNode root) {
        list = new ArrayList<TreeNode>();
        inorder(root);
        int x=-1,y=-1;
        for(int i=0;i<list.size()-1;i++){
            if(list.get(i).val > list.get(i+1).val){
                if(x==-1){
                    x = i;
                    y = i+1;
                }else y = i+1;
            }
        }
        if(x!=-1 && y!=-1){
            int temp = list.get(x).val;
            list.get(x).val = list.get(y).val;
            list.get(y).val = temp;
        }
    }
    public void inorder(TreeNode root){
        if(root == null)return;
        inorder(root.left);
        list.add(root);
        inorder(root.right);
    }
}