您的位置:首页 > 其它

Recover Binary Search Tree

2016-08-03 22:42 417 查看
Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.

算法:中序遍历二叉树,如果后边的数边前边的小,则说明出错了。如果没有找到第二个结点说明是相邻位置出错了。

class Solution {
public:
bool flag;
//记录p1的next
TreeNode* p1;
TreeNode* p2;
TreeNode* next;
//算法:中序遍历找到当前值比前一个值小的结点。找到的两个结点就是不合法的结点
void recoverTree(TreeNode *root) {
if(root == NULL)
return ;
TreeNode* pre = new TreeNode(INT_MIN);
//找到第一个值
flag = true;
helper(root,pre);
if(flag){
int tmp = p1->val;
p1->val = p2->val;
p2->val = tmp;
}
//如果没有找到P2,说明错误出现在中序遍历的相邻位置
else{
if(next == NULL)
next = pre;
int tmp = next ->val;
next->val = p1->val;
p1->val = tmp;

}
}
void helper(TreeNode*& root ,TreeNode*& pre){
if(root == NULL)
return;
//左子树
helper(root->left,pre);

//根结点处理
int key = root->val;
//找到出错点
if(key < pre->val){
if(flag){
//第一个值出错,指针指向前一个
p1 = pre;
//记录中序遍历的下一个相邻结点
next = root;
flag = !flag;
}
else{
p2 = root;
flag = !flag;
}
}
//更新pre
pre = root;

//右子树
helper(root->right,pre);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: