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
  • 相关阅读:
    [leetcode] Maximum Depth of Binary Tree
    [leetcode] Binary Tree Zigzag Level Order Traversal
    [leetcode] Binary Tree Level Order Traversal
    软工第二次极限测试
    动手动脑的问题以及课后实验性的问题3
    计算几何--半平面交与平面区域
    拉格朗日插值法
    计算几何--最小圆覆盖与最小球覆盖
    计算几何--圆与球
    程序员修炼之道读后感1
  • 原文地址:https://www.cnblogs.com/George1994/p/7507989.html
Copyright © 2011-2022 走看看