编写程序判断树是否同构?其中同构是指给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则称两棵树是“同构”的,输出True,否则输出False。 输入:第一行N,表示树的结点数; 第二行开始:结点数据 左孩子编号 右孩子编号,如果无孩子结点记为“-1”。 输入样例: 8 A 1 2 B 3 4 C 5 -1 D -1 -1 E 6 -1 G 7 -1 F -1 -1 H -1 -1 8 G -1 4 B 7 6 F -1 -1 A 5 1 H -1 -1 C 0 -1 D -1 -1 E 2 -1 输出样例:True
时间: 2023-06-11 10:04:12 浏览: 184
给定两棵树T1和T2 如果T1可以通过多次交换左右子节点转换为T2,那么我们称两棵树为“同构” 例如,图1中所示的两棵树是
请参考以下代码:
```python
class Node:
def __init__(self, data, left_child=None, right_child=None):
self.data = data
self.left_child = left_child
self.right_child = right_child
def is_isomorphic(t1, t2):
if t1 is None and t2 is None:
return True
if t1 is None or t2 is None:
return False
if t1.data != t2.data:
return False
return (is_isomorphic(t1.left_child, t2.left_child) and
is_isomorphic(t1.right_child, t2.right_child)) or \
(is_isomorphic(t1.left_child, t2.right_child) and
is_isomorphic(t1.right_child, t2.left_child))
def create_tree(node_info_list):
node_dict = {}
for node_info in node_info_list:
data, left_child, right_child = node_info.split()
if left_child != "-1":
left_child = node_dict[left_child]
else:
left_child = None
if right_child != "-1":
right_child = node_dict[right_child]
else:
right_child = None
node = Node(data, left_child, right_child)
node_dict[data] = node
return node_dict[node_info_list[0].split()[0]]
if __name__ == "__main__":
n = int(input())
node_info_list1 = [input() for _ in range(n)]
node_info_list2 = [input() for _ in range(n)]
root1 = create_tree(node_info_list1)
root2 = create_tree(node_info_list2)
if is_isomorphic(root1, root2):
print("True")
else:
print("False")
```
其中,节点信息列表的格式是`[节点数据 左孩子编号 右孩子编号]`。
首先,我们定义了一个节点类`Node`,用于存储节点信息。
接下来,我们定义了一个函数`is_isomorphic`,用于判断两棵树是否同构。首先,我们需要考虑特殊情况,即两棵树都为空或者只有一棵树为空的情况。然后,我们比较两个节点的数据是否相等,如果不相等,说明两个节点不同构,直接返回False。如果两个节点的数据相等,那么我们需要考虑两种情况:(1)左子树同构,右子树同构;(2)左子树和右子树互换同构。我们用递归的方式判断左右子树是否同构即可。如果两种情况有一种成立,即两棵树同构,返回True,否则返回False。
接着,我们定义了一个函数`create_tree`,用于创建树。我们先用一个字典`node_dict`存储所有节点,然后逐个遍历节点信息列表,将节点信息中的左右孩子编号转换为对应的节点。如果左孩子或右孩子为空,对应的节点为None。每次创建完一个节点后,我们将其加入字典中。最后,我们返回树的根节点。
最后,我们先读入节点数量`n`,然后分别读入两棵树的节点信息列表,并用`create_tree`函数创建两棵树的根节点。最后,我们调用`is_isomorphic`函数判断两棵树是否同构,并输出结果。
阅读全文