Computer >> Máy Tính >  >> Lập trình >> Python

Xây dựng một BST từ truyền tải đơn đặt hàng đã cho bằng cách sử dụng Stack trong Python


Giả sử chúng ta có một trình duyệt thứ tự của cây tìm kiếm nhị phân; chúng ta phải tìm cây tìm kiếm nhị phân từ nó.

Vì vậy, nếu đầu vào là [6, 12, 10, 55, 45, 15], thì đầu ra sẽ

Xây dựng một BST từ truyền tải đơn đặt hàng đã cho bằng cách sử dụng Stack trong Python

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Định nghĩa một hàm giải quyết (). Việc này sẽ có đơn đặt hàng sau

  • n:=kích thước của đơn đặt hàng bưu điện

  • root:=tạo một nút cây mới với phần tử cuối cùng của postorder

  • stk:=một ngăn xếp

  • chèn root vào stk

  • i:=n - 2

  • while i> =0, do

    • x:=tạo một nút mới với giá trị postorder [i]

    • trong khi stk không trống và postorder [i]

      • temp:=top of stk

      • xóa phần tử hàng đầu khỏi stk

    • nếu tạm thời không null, thì

      • temp.left:=x

    • nếu không,

      • bên phải của phần tử trên cùng của stk:=x

    • chèn x vào stk

    • i:=i - 1

  • trả về thư mục gốc

  • Từ phương thức chính, hãy làm như sau -

  • trả lại giải quyết (đơn đặt hàng sau)

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

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)

Đầu vào

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

Đầu ra

6 10 12 15 45 55