判断两棵二叉树是否包含完全相同的元素,核心不需要关注两棵树的结构是否一致,只需要确认两棵树中所有节点的值的集合以及每个值的出现次数完全相同即可。我们可以先分别统计两棵树中每个元素出现的次数,再对比两个统计结果是否一致,就能得到最终的判断结果。

核心判断思路
整个判断过程可以分为两个步骤:
- 第一步:递归遍历第一棵二叉树,统计所有节点值的出现次数,存入一个哈希表结构中
- 第二步:递归遍历第二棵二叉树,每遇到一个节点值,就在第一个哈希表中对应的计数减1,如果遍历过程中某个值的计数不存在或者减到负数,说明元素不一致;遍历结束后如果哈希表所有计数都为0,说明元素完全相同
二叉树节点定义
首先我们需要定义二叉树的基础节点结构,这里使用Python语言实现,节点包含值和左右子节点两个属性:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val # 节点存储的值
self.left = left # 左子节点
self.right = right # 右子节点
递归统计元素次数
我们需要先实现一个递归函数,用来遍历二叉树并统计所有节点值的出现次数,这里使用字典来存储计数结果:
def count_tree_elements(node, counter):
# 如果当前节点为空,直接返回
if node is None:
return
# 当前节点值计数加1,如果不存在则初始化为1
counter[node.val] = counter.get(node.val, 0) + 1
# 递归遍历左子树
count_tree_elements(node.left, counter)
# 递归遍历右子树
count_tree_elements(node.right, counter)
递归对比元素次数
接下来实现对比的函数,遍历第二棵树的同时,对第一个统计结果进行修改,判断是否符合要求:
def check_elements_match(node, counter):
# 如果当前节点为空,直接返回True继续遍历
if node is None:
return True
# 当前节点值不在counter中,说明第一棵树没有这个元素
if node.val not in counter:
return False
# 当前节点值对应的计数已经为0,说明第一棵树该元素数量不够
if counter[node.val] == 0:
return False
# 计数减1
counter[node.val] -= 1
# 递归检查左子树和右子树,只有两边都符合才返回True
return check_elements_match(node.left, counter) and check_elements_match(node.right, counter)
完整判断函数
将两个步骤组合起来,得到最终的两棵树元素是否相同的判断函数:
def is_same_elements_tree(tree1, tree2):
# 统计第一棵树的元素计数
counter = {}
count_tree_elements(tree1, counter)
# 用第二棵树对比计数
return check_elements_match(tree2, counter)
测试示例
我们构造两棵结构不同但元素相同的二叉树,以及两棵元素不同的二叉树来验证函数的正确性:
# 构造第一棵二叉树:根节点1,左子节点2,右子节点3 tree1 = TreeNode(1) tree1.left = TreeNode(2) tree1.right = TreeNode(3) # 构造第二棵二叉树:根节点2,左子节点1,右子节点3,结构不同但元素相同 tree2 = TreeNode(2) tree2.left = TreeNode(1) tree2.right = TreeNode(3) # 构造第三棵二叉树:元素多了个4,和第一棵元素不同 tree3 = TreeNode(1) tree3.left = TreeNode(2) tree3.right = TreeNode(4) # 测试输出 print(is_same_elements_tree(tree1, tree2)) # 输出True,元素相同 print(is_same_elements_tree(tree1, tree3)) # 输出False,元素不同
复杂度分析
时间复杂度:需要遍历两棵树的所有节点,假设两棵树的节点数分别为n和m,那么时间复杂度是O(n + m)。
空间复杂度:递归调用栈的深度取决于树的高度,最坏情况下是O(h1 + h2),h1和h2分别是两棵树的高度;另外存储计数的字典最多存储所有不同的元素值,空间复杂度为O(k),k是不同元素的数量。