zoukankan      html  css  js  c++  java
  • 99. Recover Binary Search Tree

    You are given the root of a binary search tree (BST), where exactly two nodes of the tree were swapped by mistake. Recover the tree without changing its structure.

    Follow up: A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?

    Example 1:

    Input: root = [1,3,null,null,2]
    Output: [3,1,null,null,2]
    Explanation: 3 cannot be a left child of 1 because 3 > 1. Swapping 1 and 3 makes the BST valid.
    

    Example 2:

    Input: root = [3,1,4,null,null,2]
    Output: [2,1,4,null,null,3]
    Explanation: 2 cannot be in the right subtree of 3 because 2 < 3. Swapping 2 and 3 makes the BST valid.
    

    Constraints:

    • The number of nodes in the tree is in the range [2, 1000].
    • -231 <= Node.val <= 231 - 1

    inorder traversal, time = O(n), space = O(n)

    class Solution {
        public void recoverTree(TreeNode root) {
            List<TreeNode> nodes = new ArrayList<>();
            List<Integer> vals = new ArrayList<>();
    
            inOrder(root, nodes, vals);
            Collections.sort(vals);
    
            for(int i = 0; i < nodes.size(); i++) {
                nodes.get(i).val = vals.get(i);
            }
        }
    
        private void inOrder(TreeNode root, List<TreeNode> nodes, List<Integer> vals) {
            if(root == null) {
                return;
            }
            inOrder(root.left, nodes, vals);
            nodes.add(root);
            vals.add(root.val);
            inOrder(root.right, nodes, vals);
        }
    }
    class Solution {
        TreeNode first = null, second = null, prev = new TreeNode(Integer.MIN_VALUE);
    
        public void recoverTree(TreeNode root) {
            inOrder(root);
    
            int tmp = first.val;
            first.val = second.val;
            second.val = tmp;
        }
    
        private void inOrder(TreeNode root) {
            if(root == null) {
                return;
            }
    
            inOrder(root.left);
    
            if(first == null && prev.val >= root.val) {
                first = prev;
            }
            if(first != null && prev.val >= root.val) {
                second = root;
            }
            prev = root;
    
            inOrder(root.right);
        }
    }
  • 相关阅读:
    Apache JMeter 入门教程
    nacos 配置中心 & 服务发现 使用
    Apache Flink能用来做什么?
    使用etcd watch做服务发现
    服务的注册与发现(Consul、zookeeper、etcd、eureka、Nacos)
    四层、七层负载均衡的区别
    Apollo核心概念之“Namespace”
    Charles的原理、作用
    GIN框架中间件 C.NEXT() C.ABORT() C.SET() C.GET 跨中间件取值 GIN中间件中使用GOROUTINE
    gin内置验证器使用
  • 原文地址:https://www.cnblogs.com/fatttcat/p/13959489.html
Copyright © 2011-2022 走看看