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