恢复二叉搜索树
题目描述:给你二叉搜索树的根节点 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();
}
}复制
【每日寄语】 感谢不离不弃的你,让我知道仍有人爱我。感谢你的支持,不论今天有多挫折,我仍会勇敢地活下去。
文章转载自明日之X,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
2025年4月中国数据库流行度排行榜:OB高分复登顶,崖山稳驭撼十强
墨天轮编辑部
2315次阅读
2025-04-09 15:33:27
数据库国产化替代深化:DBA的机遇与挑战
代晓磊
1073次阅读
2025-04-27 16:53:22
2025年3月国产数据库中标情况一览:TDSQL大单622万、GaussDB大单581万……
通讯员
664次阅读
2025-04-10 15:35:48
数据库,没有关税却有壁垒
多明戈教你玩狼人杀
535次阅读
2025-04-11 09:38:42
国产数据库需要扩大场景覆盖面才能在竞争中更有优势
白鳝的洞穴
512次阅读
2025-04-14 09:40:20
最近我为什么不写评论国产数据库的文章了
白鳝的洞穴
472次阅读
2025-04-07 09:44:54
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
430次阅读
2025-04-17 17:02:24
2025年4月国产数据库中标情况一览:4个千万元级项目,GaussDB与OceanBase大放异彩!
通讯员
420次阅读
2025-04-30 15:24:06
天津市政府数据库框采结果公布,7家数据库产品入选!
通讯员
405次阅读
2025-04-10 12:32:35
优炫数据库成功入围新疆维吾尔自治区行政事业单位数据库2025年框架协议采购!
优炫软件
349次阅读
2025-04-18 10:01:22