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

สร้างไบนารีทรีจากการสั่งซื้อล่วงหน้าและการสั่งซื้อทางไปรษณีย์ใน Python


สมมติว่าเรามีลำดับการข้ามผ่านสองลำดับ Preorder และ Postorder เราต้องสร้างไบนารีทรีจากสองลำดับนี้ ดังนั้นหากลำดับคือ [1,2,4,5,3,6,7], [4,5,2,6,7,3,1] ผลลัพธ์จะเป็น

สร้างไบนารีทรีจากการสั่งซื้อล่วงหน้าและการสั่งซื้อทางไปรษณีย์ใน Python

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

  • ans :=สร้าง tree node โดยรับค่า pre[0], stack :=empty stack และแทรก ans
  • i :=1 และ j :=0
  • ในขณะที่ i <ความยาวของก่อน และ j <ความยาวของโพสต์
    • ถ้าค่าสูงสุดของสแต็ก =โพสต์[j] ให้เพิ่ม j ขึ้น 1 ป๊อปอัพจากสแต็กแล้วทำซ้ำต่อไป
    • node :=สร้างโหนดต้นไม้ที่มีค่า pre[i]
    • หากด้านซ้ายของโหนดบนสุดของสแต็กว่างเปล่า ให้ตั้งค่าด้านซ้ายของโหนดบนสุดของสแต็กเป็นโหนด มิฉะนั้น ให้ตั้งค่าด้านขวาของโหนดบนสุดสแต็กเป็นโหนด
    • แทรกโหนดลงในสแต็ก
    • เพิ่ม i ขึ้น 1
  • คืนสินค้า

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

ตัวอย่าง

class TreeNode:
   def __init__(self, data, left = None, right = None):
      self.data = data
      self.left = left
      self.right = right
def height(root):
   if root is None:
      return 0
   else :
      # Compute the height of left and right subtree
      l_height = height(root.left)
      r_height = height(root.right)
      #Find the greater one, and return it
      if l_height > r_height :
         return l_height+1
      else:
         return r_height+1
def print_given_level(root, level):
   if root is None:
      return
   if level == 1:
      print(root.data,end = ',')
   elif level > 1 :
      print_given_level(root.left , level-1)
      print_given_level(root.right , level-1)
def level_order(root):
   print('[', end = '')
   h = height(root)
   for i in range(1, h+1):
      print_given_level(root, i)
   print(']')
class Solution(object):
   def constructFromPrePost(self, pre, post):
      """
      :type pre: List[int]
      :type post: List[int]
      :rtype: TreeNode
      """
      ans = TreeNode(pre[0])
      stack = [ans]
      i = 1
      j = 0
      while i < len(pre) and j < len(post):
         if stack[-1].data == post[j]:
            j+=1
            stack.pop(-1)
            continue
         node = TreeNode(pre[i])
         if not stack[-1].left:
            stack[-1].left = node
         else:
            stack[-1].right = node
            stack.append(node)
            i+=1
   return ans
ob = Solution()
pre = [1,2,4,5,3,6,7]
post = [4,5,2,6,7,3,1]
tree = ob.constructFromPrePost(pre, post)
level_order(tree)

อินพุต

[1,2,4,5,3,6,7]
[4,5,2,6,7,3,1]
pre = [1,2,4,5,3,6,7]
post = [4,5,2,6,7,3,1]

ผลลัพธ์

[1,2,3,4,5,6,7,]