利用python 完成 leetcode99 恢复二叉搜索树

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

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

示例 1:

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

   1
  /
 3
  \
   2

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

   3
  /
 1
  \
   2

示例 2:

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

  3
 / \
1   4
   /
  2

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

  2
 / \
1   4
   /
  3

进阶:

使用 O(n) 空间复杂度的解法很容易实现。
你能想出一个只使用常数空间的解决方案吗?
思路
对于二次搜索树,如果进行中序遍历会形成一个从小到大的递增序列,可以储存中序遍历的结果,检测到数列中不符合要求的节点(因为是两个节点值交换,第一个错误节点会比下一个节点的值还大,第二个错误节点的值会比上一个节点的值还小,找到这两个节点,将其值交换)

 def recoverTree(self, root):
        self.t1=None
        self.t2=None
        self.m=TreeNode(-9999999)
        '''
        通过m遍历而二叉树,第一次检测到错误节点,即下一个节点比m小时,表示m为错误节点,第二次检测到错误节点,即下一个节点比m小,表示下一个节点为错误节点,
        '''
        self.help(root)
        self.t1.val,self.t2.val=self.t2.val,self.t1.val
       
    def help(self,root):
        if root==None:return
        self.help(root.left)
        if self.t1==None and self.m.val>=root.val:self.t1=self.m#第一个错误值比下一个节点的值还大
        if self.t1!=None and self.m.val>=root.val:  self.t2=root
        self.m=root
        self.help(root.right)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值