99. Recover Binary Search Tree
总算是有树的hard了
题干:
Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
解释:
一个搜索二叉树的两个位置被交换了,让我们重构这个BST。
思考:
题干中只给了两个信息,一个是这树原来是个BST,然后是交换的节点只有两个。BST有一个特性,其中的每个点的位置是固定的,一定可以查找到的,所以实际上是让我们找不满足BST要求的节点。然而感觉做题中遇到的BST都是使用中序遍历为有序这个特性来实现的,On的解法是先把所有节点中序遍历存list,然后把所有值sort一下,最后把这些值按照顺序赋值给节点,over。但是中序遍历无论是使用递归还是使用栈都是要额外空间的,不用额外空间的方法为Morris遍历,但是感觉意义不是很大,所以还是用递归写个答案好了 Morris算法是遵循以下过程: 初始化指针指向root 如果cur不为空: 如果cur没有左节点:打印cur,cur指向右节点 如果cur有左节点:将pre指针指向cur的左子树的最右子节点 如果pre没有右子节点:将右节点指向cur cur指向cur的左子节点 如果pre有右子节点: pre的右子节点为空 打印cur的值 cur指向cur的右节点
答案:
class Solution(object):
def __init__(self):
self.res=[]
def recoverTree(self, root):
"""
:type root: TreeNode
:rtype: None Do not return anything, modify root in-place instead.
"""
self.mid(root)
node1=None
node2=None
for i in range(len(self.res)-1):
if self.res[i].val>self.res[i+1].val and node1==None:
node1=self.res[i]
node2=self.res[i+1]
elif self.res[i].val>self.res[i+1].val and node1!=None:
node2=self.res[i+1]
node1.val,node2.val=node2.val,node1.val
def mid(self,root):
if root is not None:
self.mid(root.left)
self.res.append(root)
self.mid(root.right)
答案补充:
面试的时候还是先写出一个时间复杂度最优的解比较好。