LeetCode Recover Binary Search Tree

来源:互联网 发布:唯一网络哪里人王宇杰 编辑:程序博客网 时间:2024/06/07 01:16

Description:

Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.


Solution:

这道题目最naive的解法就是利用中序排序,然后把所有的数字取出来,排序之后在利用中序遍历重新赋值。

另外还有一种更优的解法。

中序遍历的一个特点就是在遍历的过程当中就已经相当于按照大小顺序遍历(对于BST如此),所以我们如果能够在遍历的过程中将两个节点找到即可。

中序遍历时需要记录按照大小顺序前一个节点prev,如果前一个节点prev的值大于等于当前节点root的值就表示这里顺序有问题。分为两种情况:

1) a, c, b, d, e, 需要查找的两个节点相邻

2) a, d, c, b, e, 需要查找的两个节点不相邻

这两种方式可以统一用一种表达方式:

第一次出现 a1 > a2的a1是第一个需要换的数字。

最后一次出现a1 > a2的a2是第二个需要换的数字。

也就是说:

第一次出现prev.val > root.val的prev是第一个需要换的节点。

最后一次出现prev.val>root.val的root是第二个需要换的节点。


注:需要对BST的中序遍历理解比较深刻。


<span style="font-size:18px;">import java.util.*;public class Solution {TreeNode first;TreeNode second;TreeNode pre;public void recoverTree(TreeNode root) {dfs(root);int v = first.val;first.val = second.val;second.val = v;}public void dfs(TreeNode root) {if (root == null)return;dfs(root.left);if (pre != null && root.val <= pre.val) {if (first == null)first = pre;second = root;}pre = root;dfs(root.right);}}</span>



0 0
原创粉丝点击