LeetCode 剑指offer@26树的子结构 java双100%

本文深入探讨了树的匹配问题,提出了一种高效的解决方案。通过使用递归深度优先搜索(DFS),作者实现了对特定测试用例的快速响应,显著提高了算法性能。文章详细介绍了算法的实现思路和代码实现,为解决树的子结构识别提供了实用指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路

本题其实就是个匹配问题。
树的匹配问题,第一步找到第一个匹配点,然后进行逐个匹配,找到第一个匹配点可以采用层次便利或者bfs、dfs等等。本题我首先使用了层次遍历,但是发现结果只超过5%,改成递归形式的dfs之后超过100%。估计是某些特殊的测试用例使用层次遍历会很慢。
然后第二步 从该节点开始进行遍历匹配,也是有很多选择,我选择了递归的dfs,并且在每个节点上进行了一些短路操作以减少不必要的递归开销。

代码

package algorithm.jianzhiOffer;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class Q26 {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        if (A == null || B == null) return false;
        if (A.val == B.val) return sub(A, B);
        return isSubStructure(A.left, B) || isSubStructure(A.right, B);
//        Queue<TreeNode> q = new LinkedList<>();
//        q.add(A);
//        boolean re = false;
//        while (!q.isEmpty()) {
//            TreeNode a = q.poll();
//            if (a.val == B.val){
//                re = sub(a, B);
//                return re;
//            }
//            if (a.left != null) q.add(a.left);
//            if (a.right != null) q.add(a.right);
//        }
// return re;

    }

    boolean sub(TreeNode a, TreeNode b) {
        if (b == null) return true;
        if (a == null || a.val != b.val || !sub(a.left, b.left)) return false;
        return sub(a.right, b.right);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值