复原二叉搜寻树
题目形容:给你二叉搜寻树的根节点 root,该树中的两个节点被谬误地替换。请在不扭转其构造的状况下,复原这棵树。
进阶:应用 O(n) 空间复杂度的解法很容易实现。你能想出一个只应用常数空间的解决方案吗?
示例阐明请见 LeetCode 官网。
起源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl…
著作权归领扣网络所有。商业转载请分割官网受权,非商业转载请注明出处。
解法一:递归法
- 首先,通过中序遍历失去二叉搜寻树的所有节点 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();}
}
【每日寄语】感激不离不弃的你,让我晓得仍有人爱我。感激你的反对,不管明天有多挫折,我仍会怯懦地活下去。