• 99. 恢复二叉搜索树


    99. 恢复二叉搜索树

    题意

    在BST中存在两个元素被交换了,现在需要把这两个元素给交换回来变成BST。

    解题思路

    1. 将其转为数组,并且排好序后重新赋值给树结点;

    1. 使用变量pre来保存访问的前一个结点,因为是中序遍历,所以前面一个结点必然是小于当前结点的,并且用两个变量维护错误的两个结点,最后将这两个结点的值进行交换;(需要注意的是,可能存在父结点和子结点交换的情况,所以在开始的时候都保存下来)

    实现

    class Solution(object):
       mistake1 = None
       mistake2 = None
       pre = None
       def recoverTree(self, root):
           """
          :type root: TreeNode
          :rtype: void Do not return anything, modify root in-place instead.
          """
           def dfs(node):
               if not node:
                   return
               
               dfs(node.left)
               if self.pre and node.val < self.pre.val:
                   if not self.mistake1:
                       self.mistake1 = self.pre
    self.mistake2 = node
               
               self.pre = node
               dfs(node.right)
           
           dfs(root)
           if self.mistake1 and self.mistake2:
               self.mistake1.val, self.mistake2.val = self.mistake2.val, self.mistake1.val
               
    def recoverTree(self, root):
           """
          :type root: TreeNode
          :rtype: void Do not return anything, modify root in-place instead.
          """
           node_list, val_list = [], []
           def dfs(node):
               if not node:
                   return
               
               dfs(node.left)
               node_list.append(node)
               val_list.append(node.val)
               dfs(node.right)
           
           dfs(root)
           val_list.sort()
           for idx, val in enumerate(val_list):
               node_list[idx].val = val_list[idx]

    def recoverTree(self, root):
           """
          迭代实现
          :type root: TreeNode
          :rtype: void Do not return anything, modify root in-place instead.
          """
           cur, pre = root, None
           first, second = None, None
           stack = []
           
           while cur or stack:
               if cur:
                   stack.append(cur)
                   cur = cur.left
               else:        
                   node = stack.pop()
                   if pre and pre.val >= node.val:
                       if not first:
                           first = pre
                       second = node
                       
                   pre = node
                   cur = node.right
           
           first.val, second.val = second.val, first.val
  • 相关阅读:
    ubuntu开机启动
    我的linux之路
    继承
    oracle 10g win7 win8 下的安装
    Java 安全检测
    BigDecimal 四舍五入
    Java Map 便利
    java split . |
    java 爬虫 Jsoup
    获取当前路径
  • 原文地址:https://www.cnblogs.com/George1994/p/7507989.html
Copyright © 2020-2023  润新知