在 Python 中制作几乎二叉搜索树(BST)以变为精确 BST 的程序

在 Python 中制作几乎二叉搜索树(BST)以变为精确 BST 的程序

假设我们有一棵二叉树,它几乎是一棵二叉搜索树,只有两个节点的值被交换了。我们需要对其进行更正并返回二叉搜索树。

因此,如果输入如下所示:

在 Python 中制作几乎二叉搜索树(BST)以变为精确 BST 的程序

那么输出将是:

在 Python 中制作几乎二叉搜索树(BST)以变为精确 BST 的程序

为了解决这个问题,我们将遵循以下步骤:

  • prev_node := null, min_node := null, max_node := null
  • found_one := False
  • 对于根中中序遍历的每个节点,进行以下操作
    • 如果 prev_node 不为空,则
      • 如果 node 的值小于 prev_node 的值,则
      • 如果 min_node 为空或者 node 的值小于 min_node 的值,则
        • min_node := node
      • 如果 max_node 为空或者 max_node 的值小于 prev_node 的值,则
        • max_node := prev_node
      • 如果 found_one 为真,则
        • 退出循环
      • 否则,
        • found_one := True
      • prev_node := node
  • 交换 min_node 和 max_node 的值
  • 返回根

让我们看看下面的实现,以更好地理解

示例

class TreeNode:
   def __init__(self, data, left = None, right = None):
      self.val = data
      self.left = left
      self.right = right
     
def print_tree(root):
   if root is not None:
      print_tree(root.left)
      print(root.val, end = ', ')
      print_tree(root.right)
   
def __iter__(self):
   if self.left:
      for node in self.left:
         yield node
   yield self
   if self.right:
      for node in self.right:
         yield node

setattr(TreeNode, "__iter__", __iter__)
class Solution:
   def solve(self, root):
      prev_node = None
      min_node = None
      max_node = None
      found_one = False
      for node in root:
         if prev_node:
            if node.val < prev_node.val:
               if min_node is None or node.val < min_node.val:
                  min_node = node
               if max_node is None or max_node.val < prev_node.val:
                  max_node = prev_node
               if found_one:
                  break
               else:
                  found_one = True
         prev_node = node
      min_node.val, max_node.val = max_node.val, min_node.val
      return root
     
ob = Solution()
root = TreeNode(3)
root.left = TreeNode(6)
root.right = TreeNode(8)
root.right.left = TreeNode(2)
root.right.right = TreeNode(9)
print_tree(ob.solve(root))

输入

root = TreeNode(3)
root.left = TreeNode(6)
root.right = TreeNode(8)
root.right.left = TreeNode(2)
root.right.right = TreeNode(9)

输出

2, 3, 6, 8, 9,

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程