leetcode -- Recover Binary Search Tree -- 重点

来源:互联网 发布:aim120 pl12知乎 编辑:程序博客网 时间:2024/05/27 14:15

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
0 0
原创粉丝点击