当前位置: 首页 > news >正文

LeetCode算法题(Go语言实现)_34

题目

考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。
如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。
如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。

一、代码实现

func leafSimilar(root1 *TreeNode, root2 *TreeNode) bool {
    // 递归法遍历叶子节点(网页3、5)
    var getLeaves func(root *TreeNode) []int
    getLeaves = func(root *TreeNode) []int {
        if root == nil {
            return []int{}
        }
        if root.Left == nil && root.Right == nil {
            return []int{root.Val}
        }
        // 左子树优先遍历保证顺序(网页2、3)
        return append(getLeaves(root.Left), getLeaves(root.Right)...)
    }
    leaves1 := getLeaves(root1)
    leaves2 := getLeaves(root2)
    return reflect.DeepEqual(leaves1, leaves2)
}

二、算法分析

1. 核心思路
  • 深度优先遍历:递归遍历二叉树,优先访问左子树,确保叶子节点按从左到右顺序收集
  • 序列比对:比较两棵树的叶子值序列是否完全一致
2. 关键步骤
  1. 递归终止条件:空节点返回空数组,叶子节点返回自身值
  2. 递归分解:将左右子树的叶子序列合并
  3. 最终比对:使用reflect.DeepEqual判断切片相等性
3. 复杂度
指标说明
时间复杂度O(n)每个节点访问一次,n为节点总数
空间复杂度O(h)h为树的高度(递归栈空间)

三、图解示例

以二叉树root1 = [3,5,1,6,2,9,8,null,null,7,4]root2 = [3,5,1,6,7,4,2,null,null,null,null,null,null,9,8]为例:
在这里插入图片描述

四、边界条件与扩展

1. 特殊场景验证
  • 空树对比root1=nil, root2=nil → true
  • 结构不同但叶序相同:如root1=[1,2,3], root2=[1,3,2] → false
  • 单节点树root1=[5], root2=[5] → true
2. 多语言实现
# Python实现(网页2、3)
class Solution:
    def leafSimilar(self, root1: TreeNode, root2: TreeNode) -> bool:
        def dfs(node):
            if not node: return []
            if not node.left and not node.right: return [node.val]
            return dfs(node.left) + dfs(node.right)
        return dfs(root1) == dfs(root2)
// Java实现(网页4)
class Solution {
    public boolean leafSimilar(TreeNode root1, TreeNode root2) {
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        dfs(root1, list1);
        dfs(root2, list2);
        return list1.equals(list2);
    }
    
    private void dfs(TreeNode node, List<Integer> list) {
        if (node == null) return;
        if (node.left == null && node.right == null) list.add(node.val);
        dfs(node.left, list);
        dfs(node.right, list);
    }
}

五、总结与扩展

1. 核心创新点
  • 递归分治策略:将复杂问题分解为子树处理
  • 顺序保障机制:左子树优先遍历确保叶序一致性
  • 内存优化设计:Go语言切片操作避免全局变量
2. 扩展应用
  • 并行遍历优化:使用协程同时遍历两棵树,实时比对叶子值
  • 非递归实现:用栈模拟递归过程,避免栈溢出风险
  • 流式处理:边遍历边比较,提前终止不匹配的情况
3. 工程优化方向
  • 内存预分配:根据树高度预切片容量(Go语言)
  • 迭代器模式:实现叶子节点迭代器支持大规模数据处理
  • 并发安全:添加互斥锁支持多线程环境下的遍历

相关文章:

  • 排序扩展-文件递归排序(外排序)
  • [ERROR] Some problems were encountered while processing the POMs
  • 鸿蒙开发_ARKTS快速入门_语法说明_组件声明_组件手册查看---纯血鸿蒙HarmonyOS5.0工作笔记010
  • 1631. 最小体力消耗路径
  • Quartz 数据持久化 接入MySQL数据库 数据不丢失 数据入库
  • 人工智能通识速览(Part4. 评估指标)
  • Android WiFi协议之P2P介绍与实践
  • git功能点管理
  • Redis 与 MongoDB 对比分析
  • Stable Diffusion XL、SD3 与 Flux 模型常用优化器总结
  • 【群晖】挂载小雅alist到AList网盘中
  • Android Automotive车载系统面试题及参考答案
  • Swift语言的云存储
  • 11231231
  • 轨检探伤专用一体机平板电脑:为铁路安全保驾护航
  • docker的几种网络模式
  • 从搜索丝滑过渡到动态规划的学习指南
  • 数据库50个练习
  • 各开源协议一览
  • js前端对时间进行格式处理
  • 习近平在河南洛阳市考察调研
  • 国家统计局:下阶段要继续发挥宏观政策作用,促进价格合理回升
  • 南宁海关辟谣网传“查获600公斤稀土材料”:实为焊锡膏
  • 盲人不能刷脸认证、营业厅拒人工核验,央媒:别让刷脸困住尊严
  • 英国知名歌手批政府:让AI公司免费使用艺术家作品是盗窃
  • 首届中国人文学科年度发展大会启幕,共话AI时代人文使命