LeetCode | Recover Binary Search Tree

100 篇文章 0 订阅
28 篇文章 0 订阅

参考文章:http://www.cnblogs.com/TenosDoIt/p/3445682.html

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?


LeetCode 上的Hard题目都不是很好想…
首先我们可以考虑一个顺序数组中有两个数据被倒置了该怎么做?
(其实也可以通过将二叉搜索树的中序遍历放到一个vector< TreeNode*>数组之中,就可以转化为这个问题)
解决思路是
从前往后找第一个逆序元素的位置,从后向前找第一个逆序元素的位置,交换

而如果不借助数组只使用栈呢?


首先我们最直观的的想法是中序遍历得到中序序列,平衡二叉树的中序序列是非递减有序的。那么问题就转化成了在非递减有序序列中交换了两个数的位置,找出这两个数并恢复有序序列,这个问题可以通过遍历一遍有序序列分下面2步完成:

  1. 首先找到第一个错误的数first,即第一个比它后缀要大的数
  2. 然后要找到第一个错误的数应该放置的位置(这就是第二个错误的数),即要找到第一个比first大的数的前驱,这个前驱就是第一个错误的数应该放的位置,也就是第二个错误的数。(注意一个特殊情况{0,1},first为1,没有找到比first大的数,这是second就是最后一个数0)

还有一种Mirror的方法可以在空间复杂度O(1)的情况下完成对二叉树的遍历,暂时不研究

class Solution {
public:
    void recoverTree(TreeNode* root) {
        TreeNode* pre=NULL,*first=NULL,*second=NULL;
        inorder(root,pre,first,second);
        if(second==NULL) second=pre;
        swap(first->val,second->val);

    }

    void inorder(TreeNode* root,TreeNode* &pre,TreeNode* &first,TreeNode* &second){
        if(!root) return;

        inorder(root->left,pre,first,second);
        if(pre!=NULL){
            if(!first && pre->val>root->val)
            first=pre;
            else if(first && root->val>first->val){
                second=pre;return;
            }
        }
        pre=root;
        inorder(root->right,pre,first,second);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值