剑指offer之树的子结构

题目描述:

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

typedef struct TreeNode
{
	int val;
	TreeNode* leftchild;
	TreeNode* rightchild;
};
class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        bool ret = false;
		if(pRoot1 != nullptr && pRoot2 != nullptr)//判空,树1和树2不为空时才进行判断(其中树2是树1的子结构)
		{
			if(pRoot1->val == pRoot2->val)//如果找到了树1和树2的根结点相等
				ret = Tree1haveTree2(pRoot1,pRoot2);//以根结点开始判断树1是否包含树2
			if(!ret)//如果没找到,就去根结点对应的左叶子结点当做起点
				ret = HasSubtree(pRoot1->leftchild,pRoot2);
			if(!ret)//如果还没找到,就去根结点对应的右叶子结点当做起点
				ret = HasSubtree(pRoot1->rightchild,pRoot2);
		}
		return ret;//返回结果
    }
	bool Tree1haveTree2(TreeNode* pRoot1, TreeNode* pRoot2)
	{
		if(pRoot2 == nullptr)//如果树2遍历完了,都匹配,则返回true
			return true;
		if(pRoot1 == nullptr)//如果树1遍历完了,树2还没遍历完,返回false
			return false;
		if(pRoot1->val != pRoot2->val)//在遍历的过程中,有一个结点没有对应上,则返回false
			return false;
		return Tree1haveTree2(pRoot1->leftchild,pRoot2->leftchild) && Tree1haveTree2(pRoot1->rightchild,pRoot2->rightchild);//根结点对应的上,分别去树1和树2左右子树里匹配
	}
};

你可能感兴趣的:(二叉树,经典面试题)