Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Note:
A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { TreeNode lastVisit; TreeNode firstNode, secondNode; public void recoverTree(TreeNode root) { traverse(root); int temp = firstNode.val; firstNode.val = secondNode.val; secondNode.val = temp; } public void traverse(TreeNode root) { if (root == null) { return; } traverse(root.left); if (lastVisit != null && lastVisit.val > root.val) { if (firstNode == null) { firstNode = lastVisit; } if (firstNode != null) { // not else secondNode = root; } } lastVisit = root; traverse(root.right); } }
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public void recoverTree(TreeNode root) { List<Integer> values = new ArrayList<>(); List<TreeNode> nodes = new ArrayList<>(); inorder(root, values, nodes); Collections.sort(values); for (int i = 0; i < nodes.size(); i++) { nodes.get(i).val = values.get(i); } } private void inorder(TreeNode root, List<Integer> values, List<TreeNode> nodes) { if (root == null) { return; } inorder(root.left, values, nodes); values.add(root.val); nodes.add(root); inorder(root.right, values, nodes); } }