原题链接: http://oj.leetcode.com/problems/recover-binary-search-tree/ 
这道题是要求恢复一颗有两个元素调换错了的二叉查找树。一開始拿到可能会认为比較复杂,事实上观察出规律了就比較简单。主要还是利用二叉查找树的主要性质,就是中序遍历是有序的性质。那么假设当中有元素被调换了,意味着中序遍历中必定出现违背有序的情况。那么会出现几次呢?有两种情况,假设是中序遍历相邻的两个元素被调换了,非常easy想到就仅仅需会出现一次违反情况,仅仅须要把这个两个节点记录下来最后调换值就能够;假设是不相邻的两个元素被调换了,举个样例非常easy能够发现,会发生两次逆序的情况,那么这时候须要调换的元素应该是第一次逆序前面的元素,和第二次逆序后面的元素。比方1234567,1和5调换了,会得到5234167,逆序发生在52和41,我们须要把4和1调过来,那么就是52的第一个元素,41的第二个元素调换就可以。
搞清楚了规律就easy实现了,中序遍历寻找逆序情况,调换的第一个元素,永远是第一个逆序的第一个元素,而调换的第二个元素假设仅仅有一次逆序,则是那一次的后一个,假设有两次逆序则是第二次的后一个。算法仅仅须要一次中序遍历,所以时间复杂度是O(n),空间是栈大小O(logn)。代码例如以下:

public void recoverTree(TreeNode root) {if(root == null)return;ArrayList<TreeNode> pre = new ArrayList<TreeNode>();pre.add(null);ArrayList<TreeNode> res = new ArrayList<TreeNode>();helper(root,pre, res);if(res.size()>0){int temp = res.get(0).val;res.get(0).val = res.get(1).val;res.get(1).val = temp;}
}
private void helper(TreeNode root, ArrayList<TreeNode> pre, ArrayList<TreeNode> res)
{if(root == null){return;}helper(root.left, pre, res);if(pre.get(0)!=null && pre.get(0).val>root.val){if(res.size()==0){res.add(pre.get(0));res.add(root);}else{res.set(1,root);}}pre.set(0,root);helper(root.right,pre,res);
}

能够看到实现中pre用了一个ArrayList来存,这样做的原因是由于java都是值传递,所以我们要全局变化pre的值(而不是在当前函数里),仅仅能传一个数组,才干改变结点的地址,这一点很重要,也是java和C++一个比較大的差别,不了解的朋友能够研究一下哈。
这道题还是考察二叉树遍历,只是应用题目要求套了一个不同的外壳,须要我们利用二叉查找树的性质观察出规律之后才干求解。

Recover Binary Search Tree -- LeetCode相关推荐

  1. LeetCode 99. Recover Binary Search Tree

    LeetCode 99. Recover Binary Search Tree 刚看到这个题真是一脸懵逼啊... 博客转载自:http://www.cnblogs.com/grandyang/p/42 ...

  2. [leetcode] Recover Binary Search Tree

    Recover Binary Search Tree Two elements of a binary search tree (BST) are swapped by mistake. Recove ...

  3. Convert Sorted Array to Binary Search Tree - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Convert Sorted Array to Binary Search Tree - LeetCode 注意点 不要访问空结点 题目要求的是平衡二叉搜 ...

  4. LeetCode OJ - Recover Binary Search Tree

    题目: Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without chan ...

  5. Recover Binary Search Tree

    Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...

  6. 99. Recover Binary Search Tree (Tree; DFS)

    Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...

  7. Recover Binary Search Tree,恢复二叉排序树

    问题描述:题意就是二叉树中有两个节点交换了,恢复结构. Two elements of a binary search tree (BST) are swapped by mistake. Recov ...

  8. 第五周 Leetcode 99. Recover Binary Search Tree (HARD)

    Leetcode99 给定一个 二叉搜索树,其中两个节点被交换,写一个程序恢复这颗BST. 只想到了时间复杂度O(n)空间复杂度O(h) h为树高的解法,还没想到空间O(1)的解法. 交换的情况只有两 ...

  9. 99. Recover Binary Search Tree(恢复二叉搜索树)

    题目链接:https://leetcode.com/problems/recover-binary-search-tree/ 思路: 看到二叉搜索树时,我想到的是中序遍历符合从大到小的原则. 然后根据 ...

  10. Convert Sorted List to Balanced Binary Search Tree leetcode

    题目:将非递减有序的链表转化为平衡二叉查找树! 参考的博客:http://blog.csdn.net/worldwindjp/article/details/39722643 利用递归思想:首先找到链 ...

最新文章

  1. ASP.NET Core 1.0 使用 MySQL for EF Core 1.0 (.NET Core 1.0)
  2. accessors 作用_lombok @Accessors用法详解(一看就能就懂)
  3. 【项目实战】基于随机森林算法的房屋价格预测模型
  4. Linux ubuntu16.04 卸载搜狗输入法(sogoupinyin)
  5. JAVA WEB开发环境搭建教程
  6. 搭建基础架构-Order
  7. UrlEncode编码算法
  8. ImportError: cannot import name 'AliPay'
  9. ASP 判断Session变量是否存在的4种方法
  10. Jquery高级编程
  11. MSP430F5529 DriverLib 库函数学习笔记(八)模数转换模块(ADC12)
  12. 未检测到其他显示器_如何将 Surface 连接到电视、显示器或投影仪,我教你
  13. 物件捆绑 背包问题 动态规划 求解
  14. 【idea插件开发】从0入门idea插件开发,idea插件开发教程,如何开发idea插件
  15. 非常实用的程序员在线工具箱大全,码农必备
  16. EAS BOS 序时簿做组织单元隔离
  17. linux gz是什么文件,gz是什么
  18. Chrome IE 中QQ快速登录失效
  19. mcc460_最新MCC和MNC国家代码运营商对应表
  20. 一些有趣但少有人知的 Python 特性

热门文章

  1. 软件测试工程师的工作总结
  2. 天啊!才几天没去看新闻,WinCE就有这么“爆炸”的新闻了?
  3. laravel 效率与java_让你的Laravel 应用运行速度飞起来!(利用PHP OPcache)
  4. netlink 0010 -- Generic Netlink 实现通信
  5. 关于连接参数-Ttext
  6. 反转字符串 不同方式
  7. vector 详解(C++)
  8. 功夫小子实践开发-游戏设置功能的实现
  9. python web 文件管理器_利用Python 1分钟搭建测试Web服务器,可实现linux目录文件共享...
  10. rdlc报表 矩形高固定_什么是 BI?和报表有什么关系?有了 BI 还要做报表吗?