一、题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
二、代码及理解
子树的可能:
判断是否是子树,当pRoot1和pRoot2一起递归遍历,pRoot2如果遍历结束说明就是子树,如果没有遍历结束,说明不是子树。
class Solution {
public:
bool Equal(int num1, int num2)
{
if(num1 - num2 == 0)
return true;
return false;
}
bool DoesTree1HasTree2(TreeNode* Root1,TreeNode* Root2)
{
if(Root2 == nullptr) //Root2为空则,说明Root2已经遍历完全说明是子树
return true;
if(Root1 == nullptr)
return false;
if(!Equal(Root1->val,Root2->val))
{
return false; //如果两个节点的值不相同,result接收到false,然后,HasSubtree()开始递归下一个节点
}
return DoesTree1HasTree2(Root1->left,Root2->left) && DoesTree1HasTree2(Root1->right,Root2->right); //当两个树的节点都相同,分别递归左子树和右子树
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool result = false;
if(pRoot1 != nullptr && pRoot2 != nullptr)
{
if(Equal(pRoot1->val,pRoot2->val))//判断当前节点的值是不是相等
{
result = DoesTree1HasTree2(pRoot1,pRoot2); //开始递归判断,包含返回true不包含返回false
}
if(!result) //初始值为false,!result为true
{
result = HasSubtree(pRoot1->left,pRoot2); //利用自身递归来寻找pRoot1左子树与pRoot2根节点相等的节点
}
if(!result)
{
result = HasSubtree(pRoot1->right,pRoot2);//利用自身递归来寻找pRoot1右子树与pRoot2根节点相等的节点
}
}
return result;
}
};
三、个人总结及感受
二叉树模型,属于相对较复杂的数据结构,一开始做入手这道题并不是直接写代码,先画好满足题意的情况,然后,自己模拟场景,把每种情况遍历一遍,找到共同点,其次,把这些共同点分别对应的是一个条件,进行模拟实现,完成代码。
我开始入手这道题时,对于我的难点是不知道如何把各个条件进行分级化,查阅了相关问题模型的处理方式,再进行程序的调试。