Recover Binary Search Tree

来源:互联网 发布:c语言编的小游戏 编辑:程序博客网 时间:2024/05/22 05:21
#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);}
0 0