Recover Binary Search Tree

一. 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?

Difficulty:Hard

TIME:TIMEOUT

解法(中序遍历)

一开始看到这个题毫无思路,因为没有找到一种判断二叉查找树对调两个元素的有效方法。当然,如果做过这道题Validate Binary Search Tree,那么再做这道题会简单很多。

首先,中序遍历可以判断一个二叉查找树的有效性,而且如果对调其中的两个元素,那么我们完全可以通过中序遍历的序列来确定对调的两个元素。

比如对于中序序列<1,2,3,4>,如果调换成了<4,2,3,1>,那么说明序列不是单调递增了,那么元素4就是肯定是其中一个调换的元素,元素2可能是其中一个调换的元素,不过后面发现3>1,说明元素1也是一个调换的元素,因此得知元素4和1调换了。

因此,寻找第一个被调换的元素很简单,肯定是第一个失序的元素,但第二个就不一定了,比如对于序列<1,2,3,4>,调换成了<2,1,3,4>,那么紧邻的1就是被调换元素,因此会有两种情况,都要考虑。

TreeNode *first = NULL;
TreeNode *second = NULL;
TreeNode *prev = NULL;
void dfs(TreeNode* root) {
    if(root == NULL)
        return;
    dfs(root->left);
    if(prev != NULL && prev->val >= root->val) {
        if(first == NULL)
            first = prev; //找到第一个调换的元素
        /*寻找第二个调换的元素,有两种可能,第一种是紧跟第一个调换的元素,第二种是后面出现的失序元素*/
        second = root;
    }
    prev = root;
    dfs(root->right);
}
void recoverTree(TreeNode* root) {
    dfs(root);
    /*调换元素*/
    int tmp = first->val;
    first->val = second->val;
    second->val = tmp;
}

代码的时间复杂度为 O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值