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
posted @ 2017-09-11 23:57  banananana  阅读(244)  评论(0编辑  收藏  举报