<强>一、题意理解强>
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构的”。现给定两棵树,请你判断它们是否是同构的。
输入格式:输入给出2棵二叉树的信息:
先在一行中给出该树的结点树,随后N行
第我行对应编号第i个结点,给出该结点中存储的字母,其左孩子结点的编号,右孩子结点的编号
如果孩子结点为空,则在相应位置给出”——“
如下图所示,有多种表示的方式,我们列出以下两种:
<强>二,求解思路强>
搜到一篇也是讲这个的,但是那篇并没有完全用到单向链表的方法,所以研究了一下,写了一个是完全用单向链表的方法:
其实应该有更优雅的删除整个单向列表的方法,比如头设为none,可能会改进下?
# python语言实现 L1=列表(地图(int、输入().split ())) L2=列表(地图(int、输入().split ())) #节点 类节点: def __init__(自我,系数经验值): 自我。系数=系数 自我。经验=经验 自我。下一个=没有 #单链表 类列表: def __init__(自我,节点=None): 自我。__head=节点 #为了访问私有类 def gethead(自我): 返回self.__head def旅行(自我): cur1=self.__head cur2=self.__head 如果cur1。下一个!=没有: cur1=cur1.next 其他: 打印(cur2。系数,cur2。实验结束=" ") 返回 而cur1。下一个!=没有: 打印(cur2。系数,cur2。实验结束=" ") cur1=cur1.next cur2=cur2.next 打印(cur2。系数,cur2。实验结束=" ") cur2=cur2.next 打印(cur2。系数,cur2。实验结束=" ") #添加物品的尾巴 def append(自我,系数经验值): 节点=节点(系数经验值) 如果自我。__head==没有: 自我。__head=节点 其他: 坏蛋=self.__head 虽然cur.next !=没有: 坏蛋=cur.next cur.next=节点 def addl (l1, l2): p1=l1.gethead () p2=l2.gethead () l3=列表() 虽然(p1不是没有),(p2不是没有): 如果(p1。经验比;p2.exp): l3.append (p1。系数,p1.exp) p1=p1.next elif (p1。exp & lt;p2.exp): l3.append (p2。系数,p2.exp) p2=p2.next 其他: 如果(p1。系数+ p2。系数==0): p1=p1.next p2=p2.next 其他: l3.append (p2。系数+ p1。系数,p1.exp) p2=p2.next p1=p1.next 虽然p1不是没有: l3.append (p1。系数,p1.exp) p1=p1.next 虽然p2不是没有: l3.append (p2。系数,p2.exp) p2=p2.next 如果l3.gethead()==没有: l3。追加(0,0) 返回l3 def考虑(l1, l2): p1=l1.gethead () p2=l2.gethead () l3=列表() l4=列表() 如果(p1不是没有),(p2不是没有): 虽然p1不是没有: 虽然p2不是没有: l4.append (p1。系数* p2。系数,p1。经验值+ p2.exp) p2=p2.next l3=addl (l3、l4) l4=列表() p2=l2.gethead () p1=p1.next 其他: l3。追加(0,0) 返回l3 def (L):本项目 l=列表() L.pop (0) 因为我在范围(0,len (L), 2): l追加(L[我],L (i + 1)) 返回l l1=(l1)本项目 l2=(l2)本项目 l3=列表() l3=考虑(l1, l2) l3.travel () 打印(" ") l3=列表() l3=addl (l1, l2) l3.travel () >之前以上就是本次介绍的全部内容知识点,相关内容可以参阅下方知识点,感谢大家对的支持。
python树的同构学习笔记