Recover Binary Search Tree -- LeetCode
这道题是要求恢复一颗有两个元素调换错了的二叉查找树。一開始拿到可能会认为比較复杂,事实上观察出规律了就比較简单。主要还是利用二叉查找树的主要性质,就是中序遍历是有序的性质。那么假设当中有元素被调换了,意味着中序遍历中必定出现违背有序的情况。那么会出现几次呢?有两种情况,假设是中序遍历相邻的两个元素被调换了,非常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相关推荐
- LeetCode 99. Recover Binary Search Tree
LeetCode 99. Recover Binary Search Tree 刚看到这个题真是一脸懵逼啊... 博客转载自:http://www.cnblogs.com/grandyang/p/42 ...
- [leetcode] Recover Binary Search Tree
Recover Binary Search Tree Two elements of a binary search tree (BST) are swapped by mistake. Recove ...
- Convert Sorted Array to Binary Search Tree - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Convert Sorted Array to Binary Search Tree - LeetCode 注意点 不要访问空结点 题目要求的是平衡二叉搜 ...
- LeetCode OJ - Recover Binary Search Tree
题目: Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without chan ...
- Recover Binary Search Tree
Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...
- 99. Recover Binary Search Tree (Tree; DFS)
Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...
- Recover Binary Search Tree,恢复二叉排序树
问题描述:题意就是二叉树中有两个节点交换了,恢复结构. Two elements of a binary search tree (BST) are swapped by mistake. Recov ...
- 第五周 Leetcode 99. Recover Binary Search Tree (HARD)
Leetcode99 给定一个 二叉搜索树,其中两个节点被交换,写一个程序恢复这颗BST. 只想到了时间复杂度O(n)空间复杂度O(h) h为树高的解法,还没想到空间O(1)的解法. 交换的情况只有两 ...
- 99. Recover Binary Search Tree(恢复二叉搜索树)
题目链接:https://leetcode.com/problems/recover-binary-search-tree/ 思路: 看到二叉搜索树时,我想到的是中序遍历符合从大到小的原则. 然后根据 ...
- Convert Sorted List to Balanced Binary Search Tree leetcode
题目:将非递减有序的链表转化为平衡二叉查找树! 参考的博客:http://blog.csdn.net/worldwindjp/article/details/39722643 利用递归思想:首先找到链 ...
最新文章
- ASP.NET Core 1.0 使用 MySQL for EF Core 1.0 (.NET Core 1.0)
- accessors 作用_lombok @Accessors用法详解(一看就能就懂)
- 【项目实战】基于随机森林算法的房屋价格预测模型
- Linux ubuntu16.04 卸载搜狗输入法(sogoupinyin)
- JAVA WEB开发环境搭建教程
- 搭建基础架构-Order
- UrlEncode编码算法
- ImportError: cannot import name 'AliPay'
- ASP 判断Session变量是否存在的4种方法
- Jquery高级编程
- MSP430F5529 DriverLib 库函数学习笔记(八)模数转换模块(ADC12)
- 未检测到其他显示器_如何将 Surface 连接到电视、显示器或投影仪,我教你
- 物件捆绑 背包问题 动态规划 求解
- 【idea插件开发】从0入门idea插件开发,idea插件开发教程,如何开发idea插件
- 非常实用的程序员在线工具箱大全,码农必备
- EAS BOS 序时簿做组织单元隔离
- linux gz是什么文件,gz是什么
- Chrome IE 中QQ快速登录失效
- mcc460_最新MCC和MNC国家代码运营商对应表
- 一些有趣但少有人知的 Python 特性
热门文章
- 软件测试工程师的工作总结
- 天啊!才几天没去看新闻,WinCE就有这么“爆炸”的新闻了?
- laravel 效率与java_让你的Laravel 应用运行速度飞起来!(利用PHP OPcache)
- netlink 0010 -- Generic Netlink 实现通信
- 关于连接参数-Ttext
- 反转字符串 不同方式
- vector 详解(C++)
- 功夫小子实践开发-游戏设置功能的实现
- python web 文件管理器_利用Python 1分钟搭建测试Web服务器,可实现linux目录文件共享...
- rdlc报表 矩形高固定_什么是 BI?和报表有什么关系?有了 BI 还要做报表吗?