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?
给定一个排序二叉树,然后任意交换了其中两个节点,要求在使用常数个空间和不改变结构的前提下恢复原来的二叉树。
如果用O(n)的空间复杂度,那么直接中序遍历就好了,现在用常数个,那么只需要记录两次就好了,中序遍历的时候,需要动动脑子。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { TreeNode pre; TreeNode first; TreeNode second; public void inorder(TreeNode root){ if(root == null){ return; } inorder(root.left); if(pre == null){ pre = root; }else{ if(pre.val > root.val){ if(first == null){ first = pre; } second = root; } pre = root; } inorder(root.right); } public void recoverTree(TreeNode root) { pre = null; first = null; second = null; inorder(root); if(first!=null && second!=null){ int tmp = first.val; first.val = second.val; second.val = tmp; } } }