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);
        }
    }
  • 相关阅读:
    Javascript中最常用的55个经典技巧
    Linux2.6--进程抢占和上下文切换
    redis 无法启动
    Dev GridView-Bind Detail Grid during runtime
    SharePoint场管理-PowerShell(二)
    SharePoint场管理-PowerShell(一)
    SharePoint的安装和配置-PowerShell
    SPField的GetValidatedString方法没有被调用
    PowerShell基础
    什么是工作流?
  • 原文地址:https://www.cnblogs.com/fatttcat/p/13959489.html
Copyright © 2011-2022 走看看