赞
踩
题目描述:给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。
进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?
示例说明请见LeetCode官网。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recover-binary-search-tree/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 首先,通过中序遍历得到二叉搜索树的所有节点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(); } }
【每日寄语】 感谢不离不弃的你,让我知道仍有人爱我。感谢你的支持,不论今天有多挫折,我仍会勇敢地活下去。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。