zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    类型反射出错
    洛阳亲友如相问 咱两还要喝一壶
    为什ipad3卖的不好呢?(爆笑)
    位置相关属性offset(),position(),scrollTop()等
    httpModules 与httpHandler
    IE7,IE8不支持New Date的解决方法
    数据库中字符长度和C#代码中字符长度
    让你的wordpress支持Window live writer
    用Windows Live Writer离线写Wordpress博客详解
    请问在数据库中怎样用模糊查询查找含有通配符的项,比如 like ' ' 我要查找含有“%”的项,怎么查?
  • 原文地址:https://www.cnblogs.com/George1994/p/7507989.html
Copyright © 2011-2022 走看看