【剑指offr--C/C++】JZ26 树的子结构

一、题目

二、分析

要判断一个树是不是另一个树的子树,这里边存在两个递归--

第一个:确定一个根节点,A树中任意一个节点都有可能是子树的根节点,若当前节点不是,那么就要将其左右子树分别作为根节点走相同的判断流程;

第二个:选择一个节点之后,将以这个节点为根的整棵树取出来与B进行比较,比较时根节点与左右子节点比较的方式是相同的。

所以我们要写两个函数,来完成两个递归。

三、代码

cpp 复制代码
/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:

    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
     //第一个递归 选择一个节点作为比较的根
        if(pRoot2==NULL) return false;  //空树不是任意一个树的子树
		if(pRoot1==NULL && pRoot2!=NULL) return false;
		if(isSon(pRoot1,pRoot2))  return true;
		if(HasSubtree(pRoot1->left, pRoot2)) return true;
		if(HasSubtree(pRoot1->right, pRoot2)) return true;
		return false;

    }

	bool isSon(TreeNode* root1, TreeNode* root2){
	//第二个递归,比较这个树上的每一个节点
		 if(root2==NULL) return true;  
		 if(root1==NULL && root2!=NULL) return false;
		 if(root1->val!=root2->val) return false;
		 bool left=isSon(root1->left, root2->left);
		 bool right=isSon(root1->right, root2->right);
		 if(left && right ) return true;
		 return false;
	}
};
相关推荐
雨落在了我的手上2 分钟前
C语言入门(二十四):数据在内存中的存储
c语言
小宝哥Code5 分钟前
UE5在布局自定义上的UE4ClassicLayout.ini文件源码解读分析
java·ue5·ue4
宠..5 分钟前
使用纯代码设计界面
开发语言·c++·qt
残花月伴8 分钟前
天机学堂-day2(我的课表)
java
汽车仪器仪表相关领域9 分钟前
PSB-1:安全增压与空燃比双监控仪表 - 高性能引擎的 “双重安全卫士“
java·人工智能·功能测试·单元测试·汽车·可用性测试·安全性测试
小此方11 分钟前
Re:从零开始的链式二叉树:建树、遍历、计数、查找、判全、销毁全链路实现与底层剖析
c语言·数据结构·c++·算法
c***212911 分钟前
删除文件夹,被提示“需要来自 TrustedInstaller 的权限。。。”的解决方案
java
狂奔小菜鸡11 分钟前
Day21 | 枚举(Enum)与常见应用场景
java·后端·java ee
ALex_zry14 分钟前
内核开发者的视角:C与Rust在系统编程中的哲学与实践
c语言·开发语言·rust
q***016515 分钟前
Spring 过滤器:OncePerRequestFilter 应用详解
java·后端·spring