03-树1 树的同构

03-树1 树的同构   (25分)

给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。


图1


图2

现给定两棵树,请你判断它们是否是同构的。

输入格式:

输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数NN (\le 1010),即该树的结点数(此时假设结点从0到N-1N1编号);随后NN行,第ii行对应编号第ii个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。

输出格式:

如果两棵树是同构的,输出“Yes”,否则输出“No”。

输入样例1(对应图1):

8
A 1 2
B 3 4
C 5 -
D - -
E 6 -
G 7 -
F - -
H - -
8
G - 4
B 7 6
F - -
A 5 1
H - -
C 0 -
D - -
E 2 -

输出样例1:

Yes

输入样例2(对应图2):

8
B 5 7
F - -
A 0 3
C 6 -
H - -
D - -
G 4 -
E 1 -
8
D 6 -
B 5 -
E - -
H - -
C 0 2
G - 3
F - -
A 1 4

输出样例2:

No
 
  • 时间限制:400ms
  • 内存限制:64MB
  • 代码长度限制:16kB
  • 判题程序:系统默认
  • 作者:陈越
  • 单位:浙江大学
python3代码如下
class node:
    def __init__(self,name):
        self.name = name
        self.left = None
        self.right = None
class Tree:
    def __init__(self):
        self.root = None
    
    def buildtree(self,sum,namelist,rlist,llist):
        treelist = []
        for name in namelist:
            treelist.append(node(name))
        for i in range(sum):
            if llist[i] ==  "-" :
                treelist[i].left = None
            else:
                l = int(llist[i])
                treelist[i].left = treelist[l]
            if rlist[i] == "-" :
                treelist[i].right = None
            else:
                r = int(rlist[i])
                treelist[i].right = treelist[r]
        #find root node
        tem = []
        tem = rlist + llist
        for seq in range(sum):
            if str(seq) not in tem:
                self.root = treelist[seq]

def judgeSameStruct(node1,node2):
    if node1 == None and node2 == None:
        return True
    elif node1 == None or node2 == None:
        return False
    elif node1.name != node2.name:
        return False
    elif node1.left == None and node2.left == None:
        return judgeSameStruct(node1.right , node2.right)
    elif (node1.left != None and node2.left != None) and (node1.left.name == node2.left.name):
        return (judgeSameStruct(node1.left,node2.left) and judgeSameStruct(node1.right,node2.right))
    else:
        return (judgeSameStruct(node1.left,node2.right) and judgeSameStruct(node1.right,node2.left))
        

def main():
    namelist= []
    rlist = []
    llist = []
    sum = int(input())
    for x in range(sum):
        strin = input().split()
        namelist.append(strin[0])
        rlist.append(strin[1])
        llist.append(strin[2])
    tree1 = Tree()
    tree1.buildtree(sum,namelist,rlist,llist)
    tree2 = Tree()
    namelist= []
    rlist = []
    llist = []
    sum = int(input())
    for x in range(sum):
        strin = input().split()
        namelist.append(strin[0])
        rlist.append(strin[1])
        llist.append(strin[2])
    tree2.buildtree(sum,namelist,rlist,llist)
    result = judgeSameStruct(tree1.root,tree2.root)
    if result:
        print("Yes")
    else:
        print("No")
    
if __name__ == "__main__":
    main()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值