题目描述
给定两棵非空二叉树 T1 和 T2 ,现在PIPI想让你判断T2 是否是T1的子树。 T1的子树包含T1的一个结点以及该结点的所有子孙结点(包括空节点)
3 / \ 4 5 / \ 1 2
给定s,
4 / \ 1 2
给定t,
则 t 是 s的子树.
3 / \ 4 5 / \ 1 2 \ 5
给定s,
4 / \ 1 2
给定t, 则 t 不是 s的子树.
输入
第一行按照先序输入s,其中空节点用 -1 表示。
第二行按照先序输入t,其中空节点用 -1 表示。
输出
若t是s的子树 ,输出"yes" , 否则输出 "no".
样例输入
3 4 1 -1 -1 2 -1 -1 5 -1 -1 4 1 -1 -1 2 -1 -1
样例输出
yes
【思路】给定树T1和T2,在T1中找到与T2根结点值相同的结点,若未找到,非T1子树;若找到,以该结点所在的子树与T2所在的树是否相等,若相等,则T2为T1的子树,若不相等,则T2不是T1的子树.
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct BiNode{
int data;
struct BiNode *lchild;
struct BiNode *rchild;
}*BiTree;
//创建一棵二叉树
void CreateTree(BiTree &T){
int data;
scanf("%d",&data);
if(cin.get()!='\n'){
if(data==-1){
T=NULL;
}else{
T=(BiTree)malloc(sizeof(BiNode));
T->data=data;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}
}
//判断以p为根的树和以根为q的树是否相等
bool isSameTree(BiTree p, BiTree q) {
if(p==NULL&&q==NULL){
return true;
}
if(p==NULL||q==NULL){
return false;
}
return p->data==q->data&&isSameTree(p->lchild,q->lchild)&&isSameTree(p->rchild,q->rchild);
}
//在树T1中找到与树T2的根结点target值相同的结点
bool FindNode(BiTree T1, BiTree target){
if (T1==NULL){
return false;
}
//从根处找到
if(T1->data==target->data&&isSameTree(T1, target)){
return true;
}
//从左子树找到
if(FindNode(T1->lchild, target)){
return FindNode(T1->lchild, target);
}
//从右子树找到
return FindNode(T1->rchild, target);//右
}
bool isSubtree(BiTree T1, BiTree T2){
//空树为任意树的子树
if(T2==NULL){
return true;
}
return FindNode(T1,T2);
}
int main(void){
BiTree T1,T2;
CreateTree(T1);
CreateTree(T2);
if(isSubtree(T1,T2)==false){
printf("no");
}else{
printf("yes");
}
return 0;
}