题目描述
输入两颗二叉树A,B,判断B是不是A的子结构。
// HasSubTree.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode{
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :val(x), left(NULL), right(NULL){}
};
TreeNode *createTree(TreeNode* &root){
int val;
cin >> val;
if (val == -1)
return NULL;
root = (TreeNode *)malloc(sizeof(TreeNode));
root->val = val;
root->left = createTree(root->left);
root->right = createTree(root->right);
return root;
}
void bfsTree(TreeNode* root){
queue<TreeNode *> q = {};
q.push(root);
while (q.size()){
TreeNode* ptr = q.front();
q.pop();
cout << ptr->val << " ";
if (ptr->left != NULL)
q.push(root->left);
if (ptr->right != NULL)
q.push(root->right);
}
}
bool equalsTo(TreeNode* pRoot1, TreeNode* pRoot2){
if (pRoot1 == NULL&&pRoot2 == NULL) return true;
else if ((pRoot1 == NULL&&pRoot2 != NULL) || (pRoot1 != NULL&&pRoot2 == NULL))
return false;
if (pRoot1->val == pRoot2->val){
return equalsTo(pRoot1->left, pRoot2->left) &&
equalsTo(pRoot1->right, pRoot2->right);
}
else
return false;
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
if (pRoot2 == NULL) return true;
if (pRoot1 == NULL) return false;
queue<TreeNode *> q = {};
q.push(pRoot1);
while (q.size()){
TreeNode* ptr = q.front();
q.pop();
if (equalsTo(ptr, pRoot2))
return true;
if (ptr->left != NULL)
q.push(pRoot1->left);
if (ptr->right != NULL)
q.push(pRoot1->right);
}
return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
TreeNode *root,*target;
int i = 0;
vector<int> v1 = { 1,2,4,5,-1,-1,-1,-1,-1,-1 };
createTree(root);
bfsTree(root);
createTree(target);
bfsTree(target);
cout<<HasSubtree(root, target);
return 0;
}