LeetCode99 Recover Binary Search Tree
2024-08-31 23:05:39
Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure. (Hard)
Note:
A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?
分析:
BST的中序遍历应该是递增的,我们考虑这样一个中序遍历序列1,2,6,4,5,3,7,其中3,6是交换了位置的。
所以我们就按照中序遍历的顺序遍历树,记录cur, prev, beforePrev三个变量;
第一次出现before < prev > cur的prev即为要交换的第一个元素,最后一个满足beforePrev > prev < cur的即为要交换的另一个元素。
然后再遍历一遍把这两个节点找出来,交换其value值即可。
注意:比如1,0这种样例,当最后一个节点是被交换的元素的时候,无法用上述判断,但如果其满足prev > cur说明cur即为要交换的元素。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
int beforePrev = -0x7FFFFFFF, prev = -0x7FFFFFFF, cur = -0x7FFFFFFF;
int s1 = -0x7FFFFFFF, s2 = -0x7FFFFFFF;
TreeNode* t1;
TreeNode* t2;
private:
void helper(TreeNode* root) {
if (root == nullptr) {
return;
}
helper(root -> left);
beforePrev = prev;
prev = cur;
cur = root -> val;
if (beforePrev < prev && prev > cur && s1 == -0x7FFFFFFF) {
s1 = prev;
}
if (beforePrev > prev && prev < cur ) {
s2 = prev;
} helper(root -> right);
} void dfs(TreeNode* root) {
if (root == nullptr) {
return;
}
dfs(root -> left);
if (root -> val == s1) {
t1 = root;
}
if (root -> val == s2) {
t2 = root;
}
dfs(root -> right);
}
public:
void recoverTree(TreeNode* root) {
helper(root);
if (cur < prev) {
s2 = cur;
}
dfs(root);
swap(t1 -> val, t2 -> val);
return;
}
};
最新文章
- 错误:java.util.Map is an interface, and JAXB can&#39;t handle interfaces.
- Java 中的 request 和response 区别
- js的extend和fn.extend使用
- iOS 7中实现模糊效果
- Spring学习8-Spring事务管理(编程式事务管理)
- Java-->;在txt文件每一行前加行数和冒号
- DOS永久设置系统环境变量-WMIC
- R语言实现数据集某一列的频数统计——with和table
- CUDA8.0+VS2013的安装和配置
- HDOJ/HDU 2549 壮志难酬(取小数点后几位~)
- (中等) HDU 1495 非常可乐,BFS。
- 【初码干货】记一次分布式B站爬虫任务系统的完整设计和实施
- linux 下用renameTo方法修改java web项目中文件夹名称问题
- python 面试题知识回顾
- Linux学习----gdb调试(指针的指针)
- TensorFlow机器学习实战指南之第一章
- 无法SSH服务器的解决过程(openssh-daemon is stopped)
- IDEA使用笔记(七)——编辑器最大个数的设置
- HDU1285 确定比赛问题【拓扑排序+优先队列】
- windows下vi/vim编辑器的基本操作