Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมสร้าง BST เกือบเป็น BST ที่แน่นอนใน python


สมมติว่าเรามีไบนารีทรีและเกือบจะเป็นทรีการค้นหาแบบไบนารี มีการสลับค่าของโหนดเพียงสองโหนดเท่านั้น เราต้องแก้ไขและส่งคืนแผนผังการค้นหาไบนารี

ดังนั้นหากอินพุตเป็นแบบ

โปรแกรมสร้าง BST เกือบเป็น BST ที่แน่นอนใน python

แล้วผลลัพธ์ที่ได้จะเป็น

โปรแกรมสร้าง BST เกือบเป็น BST ที่แน่นอนใน python

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • prev_node :=null, min_node :=null, max_node :=null
  • found_one :=เท็จ
  • สำหรับแต่ละโหนดในการข้ามผ่านของ root ให้ทำ
    • ถ้า prev_node ไม่เป็นโมฆะ
      • ถ้าค่าของโหนด <ค่าของ prev_node แล้ว
        • ถ้า min_node เป็นโมฆะหรือค่าของโหนด <ค่าของ min_node แล้ว
          • min_node :=โหนด
        • ถ้า max_node เป็นโมฆะหรือค่าของ max_node <ค่าของ prev_node แล้ว
          • max_node :=prev_node
        • ถ้า found_one เป็นจริง
          • ออกมาจากวงจร
        • มิฉะนั้น
          • found_one :=จริง
      • 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,