力扣 99. 恢复二叉搜索树

题目

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

示例

力扣 99. 恢复二叉搜索树_第1张图片
输入:root = [1,3,null,null,2]
输出:[3,1,null,null,2]
解释:3 不能是 1 左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。

力扣 99. 恢复二叉搜索树_第2张图片
输入:root = [3,1,4,null,null,2]
输出:[2,1,4,null,null,3]
解释:2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。

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

方法1:暴力(需额外空间)

1、中序遍历得到正确顺序。
2、根据正确遍历去找不正确的两个结点。

Java实现
class Solution {
    List<TreeNode> res = new ArrayList<>();

    public void recoverTree(TreeNode root) {
        traverse(root);
        TreeNode x = null;
        TreeNode y = null;

        for (int i = 0; i < res.size() - 1; i++) {
            if (res.get(i).val > res.get(i + 1).val) {
                if (x == null) x = res.get(i);
                y = res.get(i + 1);
            }
        }

        int tmp = x.val;
        x.val = y.val;
        y.val = tmp;
    }

    public void traverse(TreeNode root) {
        if (root == null) return;

        traverse(root.left);
        res.add(root);
        traverse(root.right);
    }
}

力扣 99. 恢复二叉搜索树_第3张图片

你可能感兴趣的:(力扣,leetcode,算法,职场和发展)