Python程式:將近似BST轉換為精確BST


假設我們有一棵二叉樹,它幾乎是一棵二叉搜尋樹。只有兩個節點的值被交換了。我們必須糾正它並返回二叉搜尋樹。

因此,如果輸入是這樣的:

那麼輸出將是:

為了解決這個問題,我們將遵循以下步驟:

  • prev_node := null,min_node := null,max_node := null
  • found_one := False
  • 對於根節點的中序遍歷中的每個節點,執行:
    • 如果prev_node不為空,則:
      • 如果節點的值 < prev_node的值,則:
        • 如果min_node為空或節點的值 < min_node的值,則:
          • min_node := 節點
        • 如果max_node為空或max_node的值 < prev_node的值,則:
          • max_node := prev_node
        • 如果found_one為true,則:
          • 退出迴圈
        • 否則:
          • found_one := True
      • prev_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,

更新於:2020年12月2日

146 次檢視

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告