1. 程式人生 > 程式設計 >python樹的同構學習筆記

python樹的同構學習筆記

一、題意理解

給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是“同構的”。現給定兩棵樹,請你判斷它們是否是同構的。

輸入格式:輸入給出2棵二叉樹的資訊:

先在一行中給出該樹的結點樹,隨後N行

第i行對應編號第i個結點,給出該結點中儲存的字母、其左孩子結點的編號、右孩子結點的編號

如果孩子結點為空,則在相應位置給出“-”

如下圖所示,有多種表示的方式,我們列出以下兩種:

二、求解思路

搜到一篇也是講這個的,但是那篇並沒有完全用到單向連結串列的方法,所以研究了一下,寫了一個是完全用單向連結串列的方法:

其實應該有更優雅的刪除整個單向列表的方法,比如頭設為none,可能會改進下?

# python語言實現

L1 = list(map(int,input().split()))
L2 = list(map(int,input().split()))


# 節點
class Node:
  def __init__(self,coef,exp):
    self.coef = coef
    self.exp = exp
    self.next = None


# 單鏈表
class List:
  def __init__(self,node=None):
    self.__head = node

  # 為了訪問私有類
  def gethead(self):
    return self.__head

  def travel(self):
    cur1 = self.__head
    cur2 = self.__head
    if cur1.next != None:
      cur1 = cur1.next
    else:
      print(cur2.coef,cur2.exp,end="")
      return
    while cur1.next != None:
      print(cur2.coef,end=" ")
      cur1 = cur1.next
      cur2 = cur2.next

    print(cur2.coef,end=" ")
    cur2 = cur2.next
    print(cur2.coef,end="")

  # add item in the tail
  def append(self,exp):
    node = Node(coef,exp)
    if self.__head == None:
      self.__head = node
    else:
      cur = self.__head
      while cur.next != None:
        cur = cur.next
      cur.next = node


def addl(l1,l2):
  p1 = l1.gethead()
  p2 = l2.gethead()
  l3 = List()
  while (p1 is not None) & (p2 is not None):
    if (p1.exp > p2.exp):
      l3.append(p1.coef,p1.exp)
      p1 = p1.next
    elif (p1.exp < p2.exp):
      l3.append(p2.coef,p2.exp)
      p2 = p2.next
    else:
      if (p1.coef + p2.coef == 0):
        p1 = p1.next
        p2 = p2.next
      else:
        l3.append(p2.coef + p1.coef,p1.exp)
        p2 = p2.next
        p1 = p1.next
  while p1 is not None:
    l3.append(p1.coef,p1.exp)
    p1 = p1.next
  while p2 is not None:
    l3.append(p2.coef,p2.exp)
    p2 = p2.next
  if l3.gethead() == None:
    l3.append(0,0)
  return l3


def mull(l1,l2):
  p1 = l1.gethead()
  p2 = l2.gethead()
  l3 = List()
  l4 = List()
  if (p1 is not None) & (p2 is not None):
    while p1 is not None:
      while p2 is not None:
        l4.append(p1.coef * p2.coef,p1.exp + p2.exp)
        p2 = p2.next
      l3 = addl(l3,l4)
      l4 = List()
      p2 = l2.gethead()
      p1 = p1.next
  else:
    l3.append(0,0)
  return l3


def L2l(L):
  l = List()
  L.pop(0)
  for i in range(0,len(L),2):
    l.append(L[i],L[i + 1])
  return l


l1 = L2l(L1)
l2 = L2l(L2)
l3 = List()
l3 = mull(l1,l2)
l3.travel()
print("")
l3 = List()
l3 = addl(l1,l2)
l3.travel()

以上就是本次介紹的全部內容知識點,相關內容可以參閱下方知識點,感謝大家對我們的支援。