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

สร้าง BST จากการข้ามผ่านของ postorder โดยใช้ Stack ใน Python


สมมติว่าเรามีการข้ามผ่านคำสั่งภายหลังหนึ่งรายการของแผนผังการค้นหาแบบไบนารี เราต้องหาแผนผังการค้นหาแบบไบนารีจากมัน

ดังนั้น หากอินพุตเป็น [6, 12, 10, 55, 45, 15] ผลลัพธ์ก็จะออกมา

สร้าง BST จากการข้ามผ่านของ postorder โดยใช้ Stack ใน Python

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

  • กำหนดฟังก์ชัน Solve() การดำเนินการนี้จะเป็นการสั่งทางไปรษณีย์

  • n :=ขนาดของการสั่งซื้อทางไปรษณีย์

  • root :=สร้างโหนดต้นไม้ใหม่ด้วยองค์ประกอบสุดท้ายของ postorder

  • stk :=สแต็ค

  • แทรกรูทลงใน stk

  • ฉัน :=n - 2

  • ในขณะที่ i>=0, ทำ

    • x :=สร้างโหนดใหม่ด้วยค่า postorder[i]

    • ในขณะที่ stk ไม่ว่างเปล่าและ postorder[i] <ค่าสูงสุดของ stk ให้ทำ

      • temp :=ด้านบนของ stk

      • ลบองค์ประกอบด้านบนออกจาก stk

    • ถ้า temp ไม่เป็นโมฆะ

      • temp.left :=x

    • มิฉะนั้น

      • ด้านขวาขององค์ประกอบบนสุด stk :=x

    • ใส่ x ลงใน stk

    • ผม :=ผม - 1

  • คืนค่ารูท

  • จากวิธีหลักให้ทำดังต่อไปนี้ -

  • ส่งคืนการแก้ (การสั่งซื้อทางไปรษณีย์)

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

class TreeNode:
   def __init__(self, data = 0):
      self.val = data
      self.left = None
      self.right = None
def solve(postorder):
   n = len(postorder)
   root = TreeNode(postorder[n - 1])
   stk = []
   stk.append(root)
   i = n - 2
   while ( i >= 0):
      x = TreeNode(postorder[i])
      temp = None
      while (len(stk) > 0 and postorder[i] < stk[-1].val) :
         temp = stk[-1]
         stk.pop()
      if (temp != None):
         temp.left = x
      else:
         stk[-1].right = x
      stk.append(x)
      i = i - 1
   return root
def build_tree(postorder):
   return solve(postorder)
def inord( node):
   if node:
      inord(node.left)
      print( node.val, end = " ")
      inord(node.right)
postorder = [6, 12, 10, 55, 45, 15]
root = build_tree(postorder)
print( "Inorder traversal:", end = " ")
inord(root)

อินพุต

[6, 12, 10, 55, 45, 15]

ผลลัพธ์

6 10 12 15 45 55