当前位置:   article > 正文

LeetCode-099-恢复二叉搜索树

LeetCode-099-恢复二叉搜索树
恢复二叉搜索树

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

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

示例说明请见LeetCode官网。

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

解法一:递归法
  • 首先,通过中序遍历得到二叉搜索树的所有节点allNodes,正常情况下,如果没有节点被错误的交换,allNodes所有节点应该是按升序排列,所以要找出被交换的2个节点;
  • 从后往前遍历allNodes,找到第一个值比前面的值小的节点,即为错误的第一个节点high;
  • high-1开始往前遍历allNodes,找到第一个值比high节点小的节点low,low+1位置的节点即为错误的第二个节点;
  • 交换low和high2个节点的值,即可恢复这棵树。
import java.util.ArrayList;
import java.util.List;

public class LeetCode_099 {
    public static void recoverTree(TreeNode root) {
        List<TreeNode> allNodes = inOrder(root);
        int high = -1, low = -1;
        for (int i = allNodes.size() - 1; i >= 1; i--) {
            // 找到上面的要交换的节点
            if (allNodes.get(i).val < allNodes.get(i - 1).val) {
                high = i;
                break;
            }

        }

        // 找到下面要交换的节点
        for (low = high - 1; low >= 0; low--) {
            if (allNodes.get(low).val < allNodes.get(high).val) {
                break;
            }
        }
        low++;
        int temp = allNodes.get(low).val;
        allNodes.get(low).val = allNodes.get(high).val;
        allNodes.get(high).val = temp;
    }

    /**
     * 中序遍历
     *
     * @param root
     * @return
     */
    private static List<TreeNode> inOrder(TreeNode root) {
        List<TreeNode> nodes = new ArrayList<>();
        if (root != null) {
            nodes.addAll(inOrder(root.left));
            nodes.add(root);
            nodes.addAll(inOrder(root.right));
        }
        return nodes;
    }

    public static void main(String[] args) {
        TreeNode root = new TreeNode(3);
        root.left = new TreeNode(1);
        root.right = new TreeNode(4);
        root.right.left = new TreeNode(2);

        recoverTree(root);
        System.out.println("恢复之前");
        root.print();
        System.out.println();
        System.out.println("恢复之后");
        root.print();
    }
}
  • 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
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

【每日寄语】 感谢不离不弃的你,让我知道仍有人爱我。感谢你的支持,不论今天有多挫折,我仍会勇敢地活下去。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/837067
推荐阅读
相关标签
  

闽ICP备14008679号