考点:二叉树的遍历、鲁棒性
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
分析思路
第一步,遍历要判断A,B的根节点值是否一样。写一个方法来遍历大树,找到一个和小树根节点值相等的节点。若找到,则调第二步。此处需要设一个中间变量result,若经过第二步返回false,须继续递归遍历大树。
第二步,传入两棵根节点值相同的树,判断是否和左右节点值是否一样。判断树A中R为根节点的子树是否和树B具体相同结构。如果节点R的值和树B的根节点不相同,则肯定不具有相同节点;如果值相同,则递归判断它们各自左右节点的值是否相同。递归终止条件是到达了树A或树B的叶节点。此部分,注意边界处理判断。
实现代码
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool result=false;
if(pRoot1!=NULL && pRoot2!= NULL){
//如果存在值相等的节点,进一步判断
if(pRoot1->val ==pRoot2->val){
result=DoesTree1hasTree2(pRoot1,pRoot2);
}
//如果为false,遍历A的左右节点查找
if(!result){
result=HasSubtree(pRoot1->left,pRoot2);
}
if(!result){
result=HasSubtree(pRoot1->right,pRoot2);
}
}
return result;
}
private:
bool DoesTree1hasTree2(TreeNode* pRoot1, TreeNode* pRoot2){
//2为空树
if(pRoot2==NULL)
return true;
//1为空树
if(pRoot1==NULL)
return false;
if(pRoot1->val !=pRoot2->val){
return false;
}
//判断左右孩子分别是否相等
return DoesTree1hasTree2(pRoot1->left,pRoot2->left) &&
DoesTree1hasTree2(pRoot1->right,pRoot2->right);
}
};