📜  门| GATE-CS-2016(套装2)|第 56 题(1)

📅  最后修改于: 2023-12-03 15:28:45.046000             🧑  作者: Mango

解析 GATE-CS-2016(套装2)第 56 题

这道题考察了二叉树的遍历、相似性和简单的递归操作。下面我们将详细解析一下题目,并提供一份 Python 代码供参考。

原题

我们先来看一下原题:

gate-cs-2016套题2第56题
题意

给定两个二叉树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')
总结

本题难度适中,考察了二叉树遍历和递归等基本操作,是练习二叉树算法的好题。在解题时,需要注意递归函数的终止条件,以及判断左右子树是否相似的语句等细节。