Recover Binary Search Tree
来源:互联网 发布:电子元器件查询软件app 编辑:程序博客网 时间:2024/06/06 14:05
https://oj.leetcode.com/problems/recover-binary-search-tree/
Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Note:
A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?
这一题考虑的做法第一优先就是inorder遍历看是否顺序,把乱序的两个元素交换就可以了。需要注意的是乱序的判断。
譬如 1, 2 ,3 ,4 变成了 3 ,2 ,1 ,4。这个就很容易判断了,3大于后面哪一个,1小于前面的那一个,明显是3 和1 换了
但如果变成了 2, 1, 3, 4的话。我们可以知道2肯定是不对的,但1是不是不对,就不好说了,因为1在一个错误的元素之后,所以它也必须成为一个candidate,所以再出现第二个candidate之前它就是错的那个。
那么给出代码吧。
TreeNode first = null, second = null, prev = null; public void recoverTree(TreeNode root) { inorderTraversal(root); int tmp = first.val; first.val = second.val; second.val = tmp; } public void inorderTraversal(TreeNode root){ if(root == null) return; inorderTraversal(root.left); if(prev != null){ if(root.val < prev.val){ second = root; first = first == null ? prev : first; } } prev = root; inorderTraversal(root.right); }
本身这个勉强算是一个constant space的解法,但call stack其实空间是logN的。为了严格遵守空间constant space的额外要求。这里我只能提示一个比较有名的线段二叉树的算法Morris Traversal,这是目前可以找得到的On time O1 space的真正算法。具体我就不给代码了,以后有时间我再补上吧。
给个链接大家有兴趣可以自己研究,大概理念就是通过不断的更改树的结构达到可以回到根节点最后再更改回来原来树的形态的一个算法:
http://www.cnblogs.com/AnnieKim/archive/2013/06/15/morristraversal.html
0 0
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Recover Binary Search Tree
- Android之开发环境android studio
- 在centos6.5下编译安装vim7.4
- 黑马程序员_java基础笔记第一天
- Windows下使用Android NDK
- 安卓表格布局android:collapseColumns,android:shrinkColumns和stretchColumn --布局
- Recover Binary Search Tree
- 判断访问浏览器的类型
- Android 动画之ScaleAnimation应用详解
- javascript数组详解
- ORA-00933: SQL 命令未正确结束 / ORA-00933: SQL command not properly ended
- 重提URL Rewrite(1):IIS与ASP.NET
- Ckeditor+Ckfinder+Ext4 整合
- 使用llcbench分析几款处理器的cache性能
- Ubuntu 12.04的SWAP设置