#include<iostream>
#include<vector>
using namespace std;
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int val):val(val),left(NULL),right(NULL){};
};
class Solution
{
public:
TreeNode *mistake1,*mistake2,* pre;
void recoverTree(TreeNode *root)
{
TreeNode *Mis1=NULL, *Mis2=NULL;
TreeNode *current,*pre, *parent=NULL;
if(root == NULL)
return;
bool found = false;
current = root;
while(current != NULL)
{
if(current->left == NULL)
{
if(parent && parent->val > current->val)
{
if(!found)
{
Mis1 = parent;
found = true;
}
Mis2 = current;
}
parent = current;
current = current->right;
}
else
{
pre = current->left;
while(pre->right != NULL && pre->right != current)
pre = pre->right;
if(pre->right == NULL)
{
pre->right = current;
current = current->left;
}
else
{
pre->right = NULL;
if(parent->val > current->val)
{
if(!found)
{
Mis1 = parent;
found = true;
}
Mis2 = current;
}
parent = current;
current = current->right;
}
}
}
display(root);
cout<<endl;
if(Mis1 && Mis2)
swap(Mis1->val, Mis2->val);
display(root);
}
void findmistake(TreeNode* root)
{
if(!root)
return;
findmistake(root->left);
if(pre&&pre->val>root->val)
{
if(!mistake1)
mistake1=pre;
mistake2=root;
}
pre=root;
findmistake(root->right);
}
void recover(TreeNode* root)
{
mistake1=mistake2=pre=NULL;
findmistake(root);
if(mistake1&&mistake2)
swap(mistake1->val,mistake2->val);
display(root);
}
void display(TreeNode* root)
{
if(!root)
return;
display(root->left);
cout<<root->val<<' ';
display(root->right);
}
};
void main()
{
TreeNode* node1=new TreeNode(6);
TreeNode* node2=new TreeNode(2);
TreeNode* node3=new TreeNode(4);
TreeNode* node4=new TreeNode(1);
TreeNode* node5=new TreeNode(3);
TreeNode* node6=new TreeNode(5);
TreeNode* node7=new TreeNode(7);
node1->left=node2;
node1->right=node3;
node2->left=node4;
node2->right=node5;
node3->left=node6;
node3->right=node7;
// Solution solution;
//solution.recoverTree(node1);
//solution.recover(node1);
Solution solution;
solution.recover(node1);
}
Recover Binary Search Tree
最新推荐文章于 2022-03-13 20:36:15 发布