首页 > 其他分享 >剑指Offer26 -- 树

剑指Offer26 -- 树

时间:2023-03-06 13:12:30浏览次数:46  
标签:TreeNode val -- res nullptr Offer26 dfs return

1. 题目描述

剑指 Offer 26. 树的子结



2. 思路

1.暴力,枚举 \(A\) 中的每个节点,对于该节点 \(dfs\) 查找 \(B\),时间复杂度为 \(O(N^2)\),\(N\) 为节点数。经典的 \(dfs\) 套 \(dfs\),爆搜出奇迹!当然,爆搜归爆搜,不要忘了剪枝。小小的剪枝大大的优化。

2.好像没有优化的做法?



3. 代码-暴力

有个小优化,那就是在枚举每个点,并以当前点搜索的时候,要保证 \(a\) 和 \(b\) 的 \(val\) 相等,否则就不搜,这样可以节省很多时间。
另外,将是否找到作为一个全局标记 \(has_res\),当已经找到后,后面的就不着了,提前结束 \(dfs\)。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
private:
    bool has_res;
    bool dfs_check(TreeNode *a, TreeNode *b) {
        // 如果 b 为空,无论 a 是否为空,都说明此时 b 是 a 的一部分
        if(b == nullptr)    return true;
        // b 不为空,a 为空,那么 b 无论如何都不可能是 a 的一部分
        if(a == nullptr)    return false;
        if(a->val != b->val)    return false;
        if(!dfs_check(a->left, b->left))  return false;
        if(!dfs_check(a->right, b->right))    return false;
        return true;
    }
    // b must not nullptr
    void dfs_split(TreeNode* a, TreeNode *b) {
        if(a == nullptr)    return ;
        if(has_res) return ;
        if(a->val == b->val && dfs_check(a, b)) {  // 小优化
            has_res = true;
            return ;
        }
        dfs_split(a->left, b);
        dfs_split(a->right, b);
    }
public:
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if(B == nullptr || A == nullptr)    return false;
        has_res = false;
        dfs_split(A, B);
        return has_res;
    }
};


标签:TreeNode,val,--,res,nullptr,Offer26,dfs,return
From: https://www.cnblogs.com/ALaterStart/p/17183451.html

相关文章

  • C++ 面向对象程序设计(中)
    (上)讲述了基于对象,(中)则是在基于对象的基础上,建立类与类之间的联系,即面向对象编程以及面向对象设计。主要讲述以下三点:Inheritance(继承)Composition(复合)Delega......
  • LeetCode -- 只出现一次的数字
    problem11.题目描述2.思路3.代码problem21.题目描述2.思路3.代码problem31.题目描述2.思路3.代码problem41.题目描述......
  • QDir类及其用法总结
    简介QDir类提供了访问系统目录结构及其内容的与平台无关的方式。头文件:#include<QDir>QDir类用来操作路径名及底层文件系统,获取关于目录路径及文件的相关信息,也......
  • EF7创建模型入门篇
    在EF7中,创建一个模型是非常重要的步骤。本文将使用微软官方文档中的指南,来学习EF7中的创建模型篇,外加一点点个人理解。实体类型在EF7中,你需要使用modelBuilder.Entity......
  • 自定义异常
    自定义异常(日常用不到)自定义异常方法:继承异常类等价于我们创造一个类,可以在里面处理产生异常后拥有的逻辑自定义异常:publicclassExceptionGeekLeeextendsExcepti......
  • 实验一
    //打印一个字符小人#include<stdio.h>intmain(){printf("OO\n");printf("<H><H>\n");printf("IIII\n");return0;}实验任务二//......
  • 异常处理
    异常异常定义异常指的是程序运行过程中出现不期而遇的各种状况,如:文件找不到,网络断开等所有异常的超类:java.lang.Throwable,分为Error和Exception两大类,前者是致命的,一般......
  • 省选模拟赛 3.4
    A注意到\(a[i]\)可以异或上任意多次\(a[1\toi-1]\),于是求出\(1\toi-1\)的线性基\(V\),能变成数的个数是\(2^{|V|}\)。评测记录//Sparkle#include<bits......
  • Pytorch中norm(几种范数norm的详细介绍)
    1.范数(norm)的简单介绍概念:距离的定义是一个宽泛的概念,只要满足非负,自反,三角不等式就可以称之为距离。范数是一种强化了的距离概念,它在定义上比距离多了一条数乘的运算法......
  • 在 swift 中将双精度值四舍五入到 x 小数位
    谁能告诉我如何在Swift中将双精度值四舍五入到x小数位?我有:vartotalWorkTimeInHours=(totalWorkTime/60/60)作为totalWorkTime第二个NSTimeInterval(double......