Recover Binary Search Tree

来源:互联网 发布:c语言运算符号优先级 编辑:程序博客网 时间:2024/05/21 11:33

题目:

Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.

Note:
A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?

分析:先遍历一遍树的节点,用两个整数标记发生交换的节点;接着再遍历一遍树的节点,更改交换。

代码如下:

void changeTree(TreeNode *root,int &first,int &end)
    {
        if(root->left!=NULL)
        {
            changeTree(root->left,first,end);
        }
        if(root->val==first)
        {
            root->val=end;
        }
        else if(root->val==end)
        {
            root->val=first;
            return;
        }
        if(root->right!=NULL)
        {
            changeTree(root->right,first,end);
        }
        return;
    }
    void getinvalidnode(TreeNode *root,int &first,int &current,int &end,bool &flag)
    {
        if(root->left!=NULL)
        {
            getinvalidnode(root->left,first,current,end,flag);
        }
        if(current==-1)
        {
            current=root->val;
        }
        else
        {
            if(root->val<current&&(!flag))
            {
                first=current;
                end=root->val;
                flag=true;
            }
            else if(root->val<current&&flag)
            {
                end=root->val;
                return;
            }
            current=root->val;
        }
        if(root->right!=NULL)
        {
            getinvalidnode(root->right,first,current,end,flag);
        }
        return;
    }
    void recoverTree(TreeNode *root) {
        if(root==NULL)return;
        int first=-1,current=-1,end=-1;
        bool flag=false;
        getinvalidnode(root,first,current,end,flag);
        if(first!=-1&&end!=-1)
             changeTree(root,first,end);
        return;     
    }