99. 恢复二叉搜索树

二叉搜索树中的两个节点被错误地交换。

请在不改变其结构的情况下,恢复这棵树。

示例 1:

输入: [1,3,null,null,2]

   1
  /
 3
  \
   2

输出: [3,1,null,null,2]

   3
  /
 1
  \
   2

分析:

1.假如一个bst中序是4,2,3,1,我们发现要交换1和4,找到1和4并交换即可,通过观察发现,第一个要交换的节点是第一次前一个数大于当前数,第二个节点是第二次前一个数大于当前的数,所以我们需要维持一个pre指针指向前一个节点

2.如果用o(n)的辅助空间可以这么做,利用bst中序有序的特点,将节点全部存起来,将值排序后再分别赋值

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution(object):
    def recoverTree(self, root):
        self.firstNode,self.secondNode=None,None
        self.preNone=TreeNode(float("-inf"))
        def dfs(t):
            if not t:return 
            dfs(t.left)
            if self.firstNode==None and self.preNone.val >= t.val:
                self.firstNode=self.preNone
            if self.firstNode and self.preNone.val >= t.val:
                self.secondNode=t
            self.preNone=t
            dfs(t.right)
        dfs(root)
        self.firstNode.val,self.secondNode.val=self.secondNode.val,self.firstNode.val

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution(object):
    def recoverTree(self, root):
        tree=[]
        val=[]
        def dfs(t):
            if not t:return 
            dfs(t.left)
            tree.append(t)
            val.append(t.val)
            dfs(t.right)
        dfs(root)
        val=sorted(val)
        for i in range(len(val)):
            tree[i].val=val[i]

 

你可能感兴趣的:(Leetcode)