• 边工作边刷题:70天一遍leetcode: day 18


    Recover Binary Search Tree

    要点:如果两个交换,那么会有两对顺序相反,或者如果是相邻的交换,那么仅有一对。所以第一次发现逆序更新first和second,第二次只更新second

    • in order traversal如何track prev?其实和bst找第k个或者前一个都是一个pattern。就是先递归向左,返回后,prev已经更新。然后root变prev,然后递归向右
    • 因为python是pass-by-value的,所以prev只能用全局变量,而不能pass around。也不需要返回

    python实现中的问题:

    • 首先first和second是global的,在python里,nested function可以读enclosing的变量,但是不能update(update就变成对local变量操作)。所以这题把变量弄成class member
    # 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 _recover(self, root):
            if not root:
                return 
    
            if root.left:
                self._recover(root.left)
            # print root.val,self.prev
            if self.prev and root.val<self.prev.val:
                if self.first is None:
                  self.first = self.prev
                self.second = root
            self.prev = root
            # print self.prev
            if root.right:
                self._recover(root.right)
        
        def recoverTree(self, root):
            """
            :type root: TreeNode
            :rtype: void Do not return anything, modify root in-place instead.
            """
            self.first = None
            self.second = None
            self.prev = None
            
            self._recover(root)
            self.first.val, self.second.val = self.second.val, self.first.val
                
            
    
  • 相关阅读:
    多线程中变量的内存分配
    VS2019解决Cannot resolve symbol ' '问题
    排序算法——选择排序
    观察者模式
    c# 之linq——小白入门级
    c# 迭代器
    MySql学习
    rabbitmq安装及简单demo练习
    VMware Workstation 12 PRo密钥
    远程过程调用——RPC
  • 原文地址:https://www.cnblogs.com/absolute/p/5677888.html
Copyright © 2020-2023  润新知