当前位置: 首页 > 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语言)
  • 迭代器模式:实现叶子节点迭代器支持大规模数据处理
  • 并发安全:添加互斥锁支持多线程环境下的遍历
http://www.dtcms.com/a/117930.html

相关文章:

  • 排序扩展-文件递归排序(外排序)
  • [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前端对时间进行格式处理
  • 数据结构与算法-数学-基础数学算法(筛质数,最大公约数,最小公倍数,质因数算法,快速幂,乘法逆元,欧拉函数)
  • pyTorch-迁移学习-图片数据增强-四种天气图片的多分类问题
  • 群体智能优化算法-白鲨优化算法(White Shark Optimizer,WSO,含Matlab源代码)
  • JS中的WeakMap
  • 思考 - 操作系统
  • 路由器工作在OSI模型的哪一层?
  • babel-runtime 如何缩小打包体积
  • usbip学习记录
  • 基于springboot微信小程序课堂签到及提问系统(源码+lw+部署文档+讲解),源码可白嫖!
  • 自动提取pdf公式 ➕ 输出 LaTeX