Recover Binary Search Tree
来源:互联网 发布:云计算与cdn 编辑:程序博客网 时间:2024/06/06 01:07
一. 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?
Difficulty:Hard
TIME:TIMEOUT
解法(中序遍历)
一开始看到这个题毫无思路,因为没有找到一种判断二叉查找树对调两个元素的有效方法。当然,如果做过这道题Validate Binary Search Tree,那么再做这道题会简单很多。
首先,中序遍历可以判断一个二叉查找树的有效性,而且如果对调其中的两个元素,那么我们完全可以通过中序遍历的序列来确定对调的两个元素。
比如对于中序序列<1,2,3,4>,如果调换成了<4,2,3,1>,那么说明序列不是单调递增了,那么元素4就是肯定是其中一个调换的元素,元素2可能是其中一个调换的元素,不过后面发现3>1,说明元素1也是一个调换的元素,因此得知元素4和1调换了。
因此,寻找第一个被调换的元素很简单,肯定是第一个失序的元素,但第二个就不一定了,比如对于序列<1,2,3,4>,调换成了<2,1,3,4>,那么紧邻的1就是被调换元素,因此会有两种情况,都要考虑。
TreeNode *first = NULL;TreeNode *second = NULL;TreeNode *prev = NULL;void dfs(TreeNode* root) { if(root == NULL) return; dfs(root->left); if(prev != NULL && prev->val >= root->val) { if(first == NULL) first = prev; //找到第一个调换的元素 /*寻找第二个调换的元素,有两种可能,第一种是紧跟第一个调换的元素,第二种是后面出现的失序元素*/ second = root; } prev = root; dfs(root->right);}void recoverTree(TreeNode* root) { dfs(root); /*调换元素*/ int tmp = first->val; first->val = second->val; second->val = tmp;}
代码的时间复杂度为
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
- 【计算机视觉】目标检测中的指标衡量Recall与Precision
- 三层架构及分层
- pthread_cond_broadcast相关
- 调用远程方法,返回json数据,并解析
- 信号量、互斥体和自旋锁
- Recover Binary Search Tree
- ARM汇编常用代码2
- Mac 安装Redis
- HDU5437-贪心
- Scrapy定向爬虫教程(三)——爬取多个页面
- c语言:快递管理系统
- 2058 括号序列
- [leetcode:python]20.Valid Parentheses
- 如何处理需要填充的数据为空的情况