输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)假设元素无重复,采用中跟遍历,不包含##这种,因为中庚遍历可以确定一颗二叉树。
解答步骤
第一步:声明结构体
struct Node{
int val;
Node *LC;
Node *RC;
Node(int k){
this->val=k;
LC=NULL;
RC=NULL;
}
};
第二步:
中跟遍历:(递归实现)迭代可以参考 blog 二叉树 先根遍历 中跟遍历 后跟遍历 迭代+递归实现代码
void inOrder(Node *root,vector<int> &a){
if(root==NULL){
return ;
}
inOrder(root->LC,a);
a.push_back(root->val);
// cout<<root->val<<" ";
inOrder(root->RC,a);
}
第三步:通过中跟遍历得到vector序列以后,进行比较。
bool HasSubtree(Node* pRoot1, Node* pRoot2)
{
vector<int> a;
inOrder(pRoot1,a);
vector<int> b;
inOrder(pRoot2,b);
if(b.size()==0){
return false;
}
int j=1;
for(int i=0;i<a.size();i++){
j=1;
if(a[i]==b[0]){
while(j<b.size()){
if(b[j]==a[i+j])
{
j++;
}
else{
break;
}
}
if(j==b.size()){
return true;
}
}
}
return false;
}
第四步:Main函数
int main(){
Node *p=new Node(5);
Node *q=new Node(2);
Node *l=new Node(6);
Node *k=new Node(3);
Node *h=new Node(9);
q->RC=k;
p->LC=q;
p->RC=l;
q->LC=h;
cout<<HasSubtree(p,q);
}
结果为1,则pRoot2是pRoot1的子树。