leetcode -- Recover Binary Search Tree -- 重点

https://leetcode.com/problems/recover-binary-search-tree/

这里有两种思路

思路1

就是inorder遍历,把value 和 node都分别用list记录下来,然后将value的list重新排序,然后赋值给node 的list
但是这里 空间复杂度为O(n), 不符合题目要求

思路2

还是inorder遍历,但是这个时候用指针记录不符合BST的node,然后交换这两个node的val即可。。这里要注意交换值即可,node不变

参考http://www.cnblogs.com/zuoyuan/p/3746594.html

这里值得注意的就是被交换的两个node可能是root和root.left, 或者root与root.right, 或者是BST中隔得很远没什么关系的两个node。如下图所示。所以我们要固定其中一个被交换的node,这里程序中用self.prev来记录第一个被交换的点,当self.n1==None, 即没有被赋值的时候才更新n1.以后就不更新了,n1已经是其中一个被交换的点了。然后就要找另一个点,用root来记录当前被搜索的点,如果不满足BST的要求,就更新n2,直到找到另外一个被交换的点。
这里写图片描述

class Solution:
    # @param root, a tree node
    # @return a tree node
    def FindTwoNodes(self, root):
            if root:
                self.FindTwoNodes(root.left)
                #这里当前node是root,把root的序列存下来就是inorder
                #这里会不停地向左下角试探,一直到root是最左的node,那么root.left为NULL,
                #那么上面的这个FindTwoNodes会返回,再判断下一句,这里self.prev还是初始值None
                #所以要加上self.prev的判断,然后再判断是否有大小关系不对。

                if self.prev and self.prev.val > root.val:
                    self.n2 = root
                    if self.n1 == None: self.n1 = self.prev#解释在上面思路部分
                self.prev = root#这里把当前节点root记下来,再去scan右子树
                self.FindTwoNodes(root.right)
    def recoverTree(self, root):
        self.n1 = self.n2 = None
        self.prev = None
        self.FindTwoNodes(root)
        self.n1.val, self.n2.val = self.n2.val, self.n1.val
        return root
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值