1303: 判断树的子树(二叉树)

题目描述

给定两棵非空二叉树 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;
} 
 
发布了61 篇原创文章 · 获赞 6 · 访问量 5728

猜你喜欢

转载自blog.csdn.net/Do_________/article/details/104207835