[leetcode] 100.Recover Binary Search Tree
2015-06-28 22:47
501 查看
题目:
Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
题意:
二叉搜索树中有两个节点互换了位置,现在需要找出这两个节点来修复这个二叉搜索树。
思路:
依旧依据搜索二叉树的顺序的性质,如果搜索二叉树是正确的,那么所有节点按照中序遍历的话是一个升序的数组。但是现在有两个节点互相交换了位置。比如原先是A1,A2,A3,…An,现在变成了A1,A2…Aj…Ai..An,即Ai与Aj互换了位置。这个时候Aj比它后面的元素大。Ai比它前面的元素小,也就是Ai前面的元素比Ai大。很明显,都是出现了某个元素比后面这个元素大。而这个比后面元素大的节点可能是Aj也可能是Ai,所以我们需要保存着四个值,Aj与后面的元素,Ai与前面的元素,这两对元素都是前面的比后面的大,我们称其为两对逆序对,本质上是无法区分开来。还有种可能,不会出现两对值,如果Ai与Aj相邻的话,那么只会出现一对逆序值。
以上。
代码如下:
Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
题意:
二叉搜索树中有两个节点互换了位置,现在需要找出这两个节点来修复这个二叉搜索树。
思路:
依旧依据搜索二叉树的顺序的性质,如果搜索二叉树是正确的,那么所有节点按照中序遍历的话是一个升序的数组。但是现在有两个节点互相交换了位置。比如原先是A1,A2,A3,…An,现在变成了A1,A2…Aj…Ai..An,即Ai与Aj互换了位置。这个时候Aj比它后面的元素大。Ai比它前面的元素小,也就是Ai前面的元素比Ai大。很明显,都是出现了某个元素比后面这个元素大。而这个比后面元素大的节点可能是Aj也可能是Ai,所以我们需要保存着四个值,Aj与后面的元素,Ai与前面的元素,这两对元素都是前面的比后面的大,我们称其为两对逆序对,本质上是无法区分开来。还有种可能,不会出现两对值,如果Ai与Aj相邻的话,那么只会出现一对逆序值。
以上。
代码如下:
/** * 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 { public: void recoverTree(TreeNode* root) { if(root == NULL)return; TreeNode* lastNode = NULL,*small = NULL,*smallLast = NULL,*big = NULL,*bigNext = NULL; InorderTree(root,lastNode,small,smallLast,big,bigNext); if(big == NULL){ swap(small->val,smallLast->val); } } void InorderTree(TreeNode* root,TreeNode* &lastNode,TreeNode* &small, TreeNode* &smallLast,TreeNode* &big,TreeNode* &bigNext){ if(root == NULL)return; InorderTree(root->left,lastNode,small,smallLast,big,bigNext); if(lastNode != NULL){ if(root->val < lastNode->val){ if(small == NULL){ small = root; smallLast = lastNode; } else{ big = lastNode; bigNext = root; if(small->val < bigNext->val && big->val > smallLast->val){ swap(small->val,big->val); return; } else{ swap(smallLast->val,bigNext->val); return; } } } } lastNode = root; InorderTree(root->right,lastNode,small,smallLast,big,bigNext); } };
相关文章推荐
- Java EE自动提示设置
- 我的异常大全之spring
- 通信原理课程设计报告
- cd,PATH,alias,man,快捷键
- 添加一个c文件,编译报错
- 8.17
- IOS微信音乐播放问题
- [leedcode]Summary Ranges
- mongodb数据结构学习1--增删改查
- IDC:中国安全市场发展潜力巨大
- IDC:中国安全市场发展潜力巨大
- PHP运行模式
- 易宝典文章——玩转Office 365中的Exchange Online服务 之五 怎样利用PSl连接Exchange Online实现管理
- C# Dictionary用法总结
- [leetcode] Median of Two Sorted Arrays 两个排序数组找出第k个数,或者中位数
- unix环境高级编程----进程控制wait()
- Storm开发过程中遇到的Topology “hang"问题
- (7/18)重学Standford_iOS7开发_视图、绘制、手势识别_课程笔记
- Linux-FLASH驱动设计二
- js页面跳转整理