导读:本期聚焦于小伙伴创作的《如何递归判断两棵二叉树是否包含完全相同的元素(结构可不同)》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何递归判断两棵二叉树是否包含完全相同的元素(结构可不同)》有用,将其分享出去将是对创作者最好的鼓励。

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

如何递归判断两棵二叉树是否包含完全相同的元素(结构可不同)

核心判断思路

整个判断过程可以分为两个步骤:

  • 第一步:递归遍历第一棵二叉树,统计所有节点值的出现次数,存入一个哈希表结构中
  • 第二步:递归遍历第二棵二叉树,每遇到一个节点值,就在第一个哈希表中对应的计数减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是不同元素的数量。

二叉树递归元素判断数据结构修改时间:2026-06-15 02:42:55

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。