您的位置:首页 > 其它

[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相邻的话,那么只会出现一对逆序值。

以上。

代码如下:

/**
* 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);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: