【leetcode详解】另一棵树的子树 (C++递归:思路精析 过程反思)

devtools/2024/10/24 2:39:20/

思路详解:


总体框架:

对root树进行先序遍历,如果当前结点(记为cur)的值和subRoot的根节点值相等时,就开始判断 

以cur为根节点的树 和 子树 是否结构一样?


如何判断两棵树是否结构完全相同?

分析:一提到“树”结构,很容易想到在(先/中/后序)遍历上做文章,请教了AI后笔者得知,如果两棵树先、后序遍历结果完全一样,那么便可说明结构完全相同(注意:先/后序中的一个 + 中序结果一样 不可说明!)

这样看来,只需要在先/后序遍历中加入结点值的判断就成了 ~


于是写出两个递归函数

int checkfir(TreeNode* root, TreeNode* subRoot)
{   //先序int re1;if(!root && !subRoot) return 1; else if(!root || !subRoot) return 0;if(root->val != subRoot->val) return 0;re1 = checkfir(root->left, subRoot->left);if(re1 == 0) return 0;re1 = checkfir(root->right, subRoot->right);return re1;
}
int checkbac(TreeNode* root, TreeNode* subRoot)
{    //后序//结构于上面类似,过程不必再表 ~
}

过程反思:

有必要写两个递归函数吗???

删了一个递归函数后,代码依然AC了...

这是为什么嘞,先序和后序只要有一个就好了吗???

答案是肯定的,因为,这函数并不是检验先序的 “最终结果” 是否一致,而是检验了“整个遍历过程”是否完全一致

To be specific, 函数实现的是两棵树“同步地”走了一遍先序遍历,如果每一步都没有出错,那就可以说明两颗树结构相同啦

所以最后只保留一个函数即可~


AC代码见下:

class Solution {
private:int checkbac(TreeNode* root, TreeNode* subRoot){int re1;if(!root && !subRoot) return 1; //trueelse if(!root || !subRoot) return 0;re1 = checkbac(root->left, subRoot->left);if(re1 == 0) return 0;re1 = checkbac(root->right, subRoot->right);if(re1 == 0) return 0;if(root->val != subRoot->val) return 0;return 1;}
public:bool isSubtree(TreeNode* root, TreeNode* subRoot) {int head = subRoot->val;if(!root) return false;if(root->val == head){if(checkbac(root, subRoot)) return true;}bool re = isSubtree(root->left, subRoot);if(re == true) return true;re = isSubtree(root->right, subRoot);if(re == true) return true;return false;}
};

~ 希望对你有启发 ~ 


http://www.ppmy.cn/devtools/89065.html

相关文章

图论:1857. 有向图中最大颜色值(拓扑排序+动态规划)

文章目录 1.问题分析2.代码解析2.1 代码步骤1. 初始化数据结构2. 构建图和入度数组3. 初始化队列4. 拓扑排序和动态规划5. 检查是否存在环并返回结果 3. 问题扩展1. 最长路径问题(DAG)2. 最短路径问题(DAG)3. 最大路径和问题4. 路…

ValueListenableBuilder 和 addListener 在 ChangeNotifier的区别

1、前言 ValueListenableBuilder 和 addListener 在 ChangeNotifier 中有不同的用途和用法,适用于不同的场景。它们的主要区别在于它们如何监听和响应状态变化,以及它们的用法和特性。 2、ValueListenableBuilder用法 ValueListenableBuilder 是一个 …

MATLAB在科研领域的重要性

引言 MATLAB(Matrix Laboratory)是由MathWorks公司开发的高性能编程语言及其交互环境,广泛应用于科研领域。其强大的计算能力、丰富的工具箱、便捷的编程环境和高效的数据可视化功能,使其成为科学研究中的重要工具。本文将详细探…

备战秋招:2024游戏开发入行与跳槽面试详解

注意:以下为本次分享概要,视频版内容更全面深入,详见文末 1.游戏开发领域秋招准备与面试技巧 本次分享由优梦创客机构的创始人雷蒙德主讲,专注于2024年秋招期间游戏开发领域的入行与跳槽面试准备。本次分享重点在于提供面试技巧…

Model Counting 2024 Public Instance Track 1 3600s测试结果

测试求解器:SharpSAT-TD与SharpSATTD-CH 3600s测试结果 测试结果图 测试数据001-051 测试数据053-101 测试数据103-151 测试数据153-199

Linux中的共享内存

#include <sys/ipc.h>#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg); shmflg: IPC_CREAT: 如果不存在&#xff0c;创建之&#xff0c;如果存在获取之。 IPC_EXCL: 1.无法单独使用 2.IPC_CREAT|IPC_EXCL:如果不存在&#xff0c;创建之…

Python爬虫

爬虫 1.什么是爬虫2.基础入门之简单的页面设计3.urllib基本使用&#xff0c;一个类型六个方法4.urllib下载5. 请求对象的定制6.get请求的quote方法7. get请求urlencode方法8.urllib_post请求百度翻译9.百度翻译详细版10.urllib_ajax的get请求豆瓣电影的第一页11.get请求豆瓣电影…

C++ 学习(2) ---- std::cout 格式化输出

目录 std::cout 格式化输出简介使用成员函数使用流操作算子 std::cout 格式化输出简介 C 通常使用cout输出数据&#xff0c;和printf()函数相比&#xff0c;cout实现格式化输出数据的方式更加多样化&#xff1b; 一方面&#xff0c;cout 作为 ostream 类的对象&#xff0c;该类…