Recover Binary Search Tree

题目:

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;     
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值