📅  最后修改于: 2023-12-03 15:28:45.046000             🧑  作者: Mango
这道题考察了二叉树的遍历、相似性和简单的递归操作。下面我们将详细解析一下题目,并提供一份 Python 代码供参考。
我们先来看一下原题:
给定两个二叉树T1和T2,判断它们是否相似。相似的定义如下:
输入共2行,每行表示一棵二叉树。每行由空格分隔的整数序列表示,每个整数表示一个节点的值。空树用 '#' 表示。
例如,第1个二叉树用序列1 2 3 # # 4 5 # # # #
表示。
如果两棵二叉树相似,输出字符串 'Yes',否则输出字符串 'No'。
1 2 3 # # 4 5 # # #
1 2 # # 3 # #
No
根据题意,我们需要逐层比较 T1 和 T2 的节点。若两者根节点不同,则它们一定不相似;若两者根节点相同,则需要将它们的左右子树递归地判断是否相似。
递归操作通常可以使用递归函数完成。递归函数的终止条件是两棵树都为空或者只有一个节点。如果两者的根节点值相同,递归地比较它们的左右子树;否则,直接返回 False。
下面是基于 Python 3 编写的参考代码:
"""
判断两个二叉树是否相似
算法分析:
递归遍历每层的节点,并比较根节点值和左右子树
输入格式:
两行字符串,每行表示一棵二叉树。每行由空格分隔的整数序列表示,每个整数表示一个节点的值。空树用 '#' 表示。
输出格式:
如果两棵二叉树相似,输出字符串 'Yes',否则输出字符串 'No'。
输入样例:
1 2 3 # # 4 5 # # #
1 2 # # 3 # #
输出样例:
No
"""
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def build_tree(nodes):
"""
将节点列表转换成二叉树
"""
if not nodes:
return None
root = TreeNode(nodes[0])
node_queue = [root]
front = 0
i = 1
while i < len(nodes):
node = node_queue[front]
front += 1
item = nodes[i]
i += 1
if item != '#':
left = TreeNode(item)
node.left = left
node_queue.append(left)
else:
node.left = None
if i >= len(nodes):
break
item = nodes[i]
i += 1
if item != '#':
right = TreeNode(item)
node.right = right
node_queue.append(right)
else:
node.right = None
return root
def is_similar(t1, t2):
"""
判断两棵二叉树是否相似
"""
if not t1 and not t2:
return True
if not t1 or not t2:
return False
if t1.val != t2.val:
return False
return is_similar(t1.left, t2.left) and is_similar(t1.right, t2.right)
nodes1 = input().strip().split()
nodes2 = input().strip().split()
root1 = build_tree(nodes1)
root2 = build_tree(nodes2)
if is_similar(root1, root2):
print('Yes')
else:
print('No')
本题难度适中,考察了二叉树遍历和递归等基本操作,是练习二叉树算法的好题。在解题时,需要注意递归函数的终止条件,以及判断左右子树是否相似的语句等细节。