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;
}
};
 

最新文章

  1. 错误:java.util.Map is an interface, and JAXB can&#39;t handle interfaces.
  2. Java 中的 request 和response 区别
  3. js的extend和fn.extend使用
  4. iOS 7中实现模糊效果
  5. Spring学习8-Spring事务管理(编程式事务管理)
  6. Java--&gt;在txt文件每一行前加行数和冒号
  7. DOS永久设置系统环境变量-WMIC
  8. R语言实现数据集某一列的频数统计——with和table
  9. CUDA8.0+VS2013的安装和配置
  10. HDOJ/HDU 2549 壮志难酬(取小数点后几位~)
  11. (中等) HDU 1495 非常可乐,BFS。
  12. 【初码干货】记一次分布式B站爬虫任务系统的完整设计和实施
  13. linux 下用renameTo方法修改java web项目中文件夹名称问题
  14. python 面试题知识回顾
  15. Linux学习----gdb调试(指针的指针)
  16. TensorFlow机器学习实战指南之第一章
  17. 无法SSH服务器的解决过程(openssh-daemon is stopped)
  18. IDEA使用笔记(七)——编辑器最大个数的设置
  19. HDU1285 确定比赛问题【拓扑排序+优先队列】
  20. windows下vi/vim编辑器的基本操作

热门文章

  1. 跟我一起了解koa(一)
  2. switch...case...之替换方案一
  3. vue/npm 错误提示&amp;解决
  4. 主流浏览器HTML5视频格式差异
  5. PHP实现微信申请退款流程实例源码
  6. 在多版本python的pip的安装与对应包的安装
  7. applyMiddleware源码中的闭包
  8. 直接在安装了redis的Linux机器上操作redis数据存储类型--对Sorted-Sets操作
  9. 轮播图js版&amp;jQ版
  10. Vue Router 相关