99. 恢复二叉搜索树

二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。

 可以大致把题目分解为两步:1.找出错误的节点,2.两个节点数据交换
 对于错误的节点,可以考虑二叉搜索树的特点,左边永远小于中间永远小于右边。所以采用中序遍历。如果是正常的二叉搜索树,那么节点的值应该是递增的,所以只需要找到有异常的两个节点就算解决了第一步
 对于节点的交换就是简单的val相交换就行了

递归

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def recoverTree(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        self.pre=TreeNode(-float("inf"))
        self.first=None
        self.second=None
        def search(root):
            if not root:
                return
            search(root.left)
            if not self.first and self.pre.val > root.val:
                self.first=self.pre
            if self.first and self.pre.val > root.val:
                self.second=root
            self.pre=root
            search(root.right)
        search(root)
        self.first.val,self.second.val=self.second.val,self.first.val

 这是看题解来写的
 在递归中,定义三个对象属性来解决函数递归中引用的问题。
 对于两个有问题的节点而言,第一个节点的值必然大于它后面节点的值,否则就是正常的;同样的,第二个节点的值必然小于它前面的节点。根据这个来给self.first和self.second赋值

执行用时 :92 ms, 在所有 Python3 提交中击败了29.32%的用户
内存消耗 :13.9 MB, 在所有 Python3 提交中击败了5.32%的用户

迭代

和递归法同样的方法

你可能感兴趣的:(99. 恢复二叉搜索树)