题解 | #树的子结构#
树的子结构
https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
//使用层次遍历的方法
//三个栈
//1.层次遍历主树
//2.判断是否与子树根节点相同
//3.如果相同,则用两个栈判断是否接下来也相同
//4.层次遍历子树,层次遍历主树中子树,一旦不相同,解除小循环
//(递归比栈循环遍历更快捷)
//使用递归的方法
//1.递归寻找相同的根节点
//1.3如果根节点为空,就返回 false(两个根都是)
//1.1如果相同,就递归比较,如果比较为true,就返回true
//1.2如果不同,就去左子树和右子树找
//2.递归比较树
//2.1如果子树为空,返回true
//2.2如果主树为空,返回false
//2.3如果两个节点相等,去左子树和右子树比较
//2.4如果不相等,返回false
#include <cstddef>
class Solution {
bool IsEqualTree(TreeNode* pRoot1, TreeNode* pRoot2){
bool result;
if(pRoot2 == nullptr)
{
return true;
}
if(pRoot1 == nullptr)
{
return false;
}
if(pRoot1 -> val == pRoot2 -> val)
{
result = IsEqualTree(pRoot1->right, pRoot2->right)&&IsEqualTree(pRoot1->left, pRoot2->left);
return result;
}
else
{
return false;
}
}
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if(pRoot1 == nullptr or pRoot2 == nullptr)
{
return false;
}
if((pRoot1 -> val == pRoot2 -> val)&&(IsEqualTree(pRoot1,pRoot2)))
{
return true;
}
else
{
return HasSubtree(pRoot1->left,pRoot2)||HasSubtree(pRoot1->right,pRoot2);
}
}
};