每天两道LeetCodeHard:(16)

109 阅读2分钟

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)

答案补充:

面试的时候还是先写出一个时间复杂度最优的解比较好。