LC99. 恢复二叉搜索树

def recoverTree(self, root):
        nodes = []
        # 中序遍历二叉树,并将遍历的结果保存到list中        
        def dfs(root):
            if not root:
                return
            dfs(root.left)
            nodes.append(root)
            dfs(root.right)
        dfs(root)
        x = None
        y = None
        pre = nodes[0]
        # 扫面遍历的结果,找出可能存在错误交换的节点x和y
        for i in range(1,len(nodes)):
            if pre.val>nodes[i].val:
                y=nodes[i]
                if not x:
                    x = pre
            pre = nodes[i]
        # 如果x和y不为空,则交换这两个节点值,恢复二叉搜索树 
        if x and y:
            x.val,y.val = y.val,x.val

不使用辅助数组,根据二叉搜索树的性质中序遍历是有序的,用pre记录前一个节点的值。第一次乱序肯定是self.pre>root, self.pre是大数不应该放在这前面记录self.pre,第二次乱序也定是self.pre>root,self.root是个小数不应该放后面,记录self.root。交换这两个值

 def recoverTree(self, root):
        """
        :type root: TreeNode
        :rtype: None Do not return anything, modify root in-place instead.
        """
        self.x = None
        self.y = None
        self.pre = None
        def dfs(root):
            if not root:
                return 
            dfs(root.left)
            if self.pre:
                if self.pre.val > root.val:      #前面的大于后面的说明找到乱序了
                    self.y = root                #记录第二次乱序的数,第二次乱序也定是self.pre>root,self.root是个小数不应该放后面
                    if not self.x:               #记录第一次乱序的数,第一次乱序肯定是self.pre>root,self.pre是大数不应该放在这前面
                        self.x = self.pre
            self.pre = root
            dfs(root.right)
        dfs(root)
        if self.x and self.y:
            self.x.val, self.y.val = self.y.val,self.x.val
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值