二叉树——判断是否是子树
树的子结构
http://www.nowcoder.com/questionTerminal/6e196c44c7004d15b1610b9afca8bd88
1.在大树中找到和小树根节点相同的节点。
2.然后以此节点为根节点,在大树上往下搜索对比小书左右节点是否相同,不同则返回false
3.如果2步中最后返回false 回到第一步,从大树的左子树找和小树根节点相同的节点。
4.如果3步中最后返回false 回到第一步,从大树的右子树找和小树根节点相同的节点。
/*
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(!pRoot1||!pRoot2)return false;
bool result = false;
if(pRoot1->val==pRoot2->val)
result = HasSubtreeHelper(pRoot1,pRoot2);
if(result==false)
result = HasSubtree(pRoot1->left,pRoot2);
if(result==false)
result = HasSubtree(pRoot1->right,pRoot2);
return result;
}
bool HasSubtreeHelper(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot2==nullptr)
return true;
if(pRoot1==nullptr)
return false;
if(pRoot1->val!=pRoot2->val)
return false;
return HasSubtreeHelper(pRoot1->left, pRoot2->left)&&HasSubtreeHelper(pRoot1->right, pRoot2->right);
}
};HasSubtree(a,b)函数:
如果ab两个子树有一个为空,false;
如果ab根节点数值相等,进入子函数;
如果前面是false,重新进入本函数,采用HasSubtree(a->left,b);
如果前面是false,重新进入本函数,采用HasSubtree(a->right,b);
子函数HasSubtreeHelper(a,b):
如果b子树被遍历完全,返回true,也就是说所有b的节点都比较完了;
如果a子树空了,false;
如果两子树的值不等,返回false;
return:两个子树左边比较 && 两个子树右边比较。
