面试题18:树的子结构
要查找树a中是否存在和树b结构一样的子结构,可分为两步:
1、在树a中找到和b的根结点的值一样的结点r
2、判断树a中以r为根结点的子树是否包含和树b一样的结构
//题目描述
//
//输入两颗二叉树A,B,判断B是不是A的子结构。
#include<windows.h>
#include<string>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
// 0ms 8568k
//class Solution {
//public:
// bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
// {
// if(pRoot1==NULL){
// return false;
// }
// if(pRoot2==NULL){
// return pRoot1==NULL;
// }
// string s1=dfs(pRoot1);
// string s2=dfs(pRoot2);
// return s1.find(s2)!=-1;
// }
// string dfs(TreeNode* root){
// if(root==NULL)return "";
// string s=""+(root->val);
// s+=dfs(root->left);
// s+=dfs(root->right);
// return s;
// }
//};
// 0ms 8552k
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1==NULL)return false;
if(pRoot2==NULL)return pRoot1==NULL;
return isSubTree(pRoot1,pRoot2)||HasSubtree(pRoot1->left,pRoot2)||HasSubtree(pRoot1->right,pRoot2);
}
bool isSubTree(TreeNode* pRoot1,TreeNode* pRoot2){
if(pRoot2==NULL)return true;
if(pRoot1==NULL)return false;
if(pRoot1->val!=pRoot2->val)return false;
bool flag=isSubTree(pRoot1->left,pRoot2->left);
if(flag)flag=isSubTree(pRoot1->right,pRoot2->right);
return flag;
}
};