题目来自http://zhedahht.blog.163.com/blog/static/25411174201011445550396/
题目:二叉树的结点定义如下:
struct TreeNode
{
int m_nValue;
TreeNode* m_pLeft;
TreeNode* m_pRight;
};
输入两棵二叉树A和B,判断树B是不是A的子结构。
例如,下图中的两棵树A和B,由于A中有一部分子树的结构和B是一样的,因此B就是A的子结构。
1 8
/ \ / \
8 7 9 2
/ \
9 2
/ \
4 7
先判断A的根节点与B的根节点是否相同,然后递归判断即可
#include<iostream>
using namespace std;
struct node{
int value;
node* left;
node* right;
};
//decide whether p2 is the substructure of p1
bool isSubStruct(node *p1,node *p2){
bool res=false;
if(p2==NULL)return true;
if(p1==NULL)//p1==NULL&&P2!=NULL
return false;
if(p1->value==p2->value){
res=isSubStruct(p1->left,p2->left);
if(res)
res=isSubStruct(p1->right,p2->right);
if(!res){
res=isSubStruct(p1->left,p2);
if(!res)
res=isSubStruct(p1->right,p2);
}
}
else{
if(p1->left!=NULL)
res=isSubStruct(p1->left,p2);
if(!res&&p1->right!=NULL)
res=isSubStruct(p1->right,p2);
}
return res;
}
int main(){
node *n=new node[4];
n->value=5;
(n+1)->value=5;
(n+2)->value=9;
(n+3)->value=6;
n->left=n+1;
n->right=n+2;
(n+1)->left=NULL;
(n+1)->right=n+3;
(n+2)->left=NULL;
(n+2)->right=NULL;
(n+3)->left=(n+3)->right=NULL;
node *m=new node[2];
m->value=5;
(m+1)->value=6;
m->left=NULL;
m->right=m+1;
(m+1)->left=NULL;
(m+1)->right=NULL;
cout<<isSubStruct(n,m)<<endl;
return 0;
}