判定是否为子树

//treeB是否为treeA的子树
#include<iostream>
#include<queue>
using namespace std;
struct binaryTreeNode
{
	int value;
	binaryTreeNode *pLeft;
	binaryTreeNode *pRight;
};
bool isSameTree(binaryTreeNode *pNode,binaryTreeNode *pRootB)
{
	if(pNode==NULL || pRootB==NULL)
	{
		return false;
	}
	//同时按层次遍历
	queue<binaryTreeNode *> treeASub,treeB;
	treeASub.push(pNode),treeB.push(pRootB);
	binaryTreeNode * pNodeA=NULL,*pNodeB=NULL;
	while(!treeASub.empty() && !treeB.empty())
	{
		pNodeA=treeASub.front();
		pNodeB=treeB.front();
		if(pNodeA->value!=pNodeB->value) return false;

		//left
		if(pNodeA->pLeft && !pNodeB->pLeft) return false;
		if(!pNodeA->pLeft && pNodeB->pLeft) return false;
		if(pNodeA->pLeft && pNodeB->pLeft)
		{
			if(pNodeA->pLeft->value != pNodeB->pLeft->value)
			{
				return false;
			}
			else 
			{
				treeASub.push(pNodeA->pLeft);
				treeB.push(pNodeB->pLeft);
			}
		}
		//right
		if(pNodeA->pRight && !pNodeB->pRight) return false;
		if(!pNodeA->pRight && pNodeB->pRight) return false;
		if(pNodeA->pRight && pNodeB->pRight)
		{
			if(pNodeA->pLeft->value != pNodeB->pLeft->value)
			{
				return false;
			}
			else 
			{
				treeASub.push(pNodeA->pRight);
				treeB.push(pNodeB->pRight);
			}
		}
		treeASub.pop();
		treeB.pop();
	}
	return true;
}

bool hasSubtree(binaryTreeNode *pRootA,binaryTreeNode *pRootB)
{
	if(pRootA==NULL || pRootB==NULL)	return false;
	//按层次遍历
	queue<binaryTreeNode *> treeA;
	binaryTreeNode *pNode=NULL;
	treeA.push(pRootA);
	while(!treeA.empty())
	{
		pNode=treeA.front();
		if(pNode->pLeft) treeA.push(pNode->pLeft);
		if(pNode->pRight) treeA.push(pNode->pRight);
		treeA.pop();
		if(pNode->value==pRootB->value)
		{
			bool ret=isSameTree(pNode,pRootB);
			if(ret)    return true;
		}
	}
	return false;
}
int main()
{
	//treeA
	binaryTreeNode n1,n2,n3,n4,n5,n6,n7;
	n1.value=8,n2.value=8,n3.value=7,n4.value=9,n5.value=2,n6.value=4,n7.value=7;
	n1.pLeft=&n2,n1.pRight=&n3;
	n2.pLeft=&n4,n2.pRight=&n5;
	n3.pLeft=n3.pRight=NULL;
	n4.pLeft=n4.pRight=NULL;
	//n5.pLeft=&n6,n5.pRight=&n7;//false
	n5.pLeft=n5.pRight=NULL;// true
	n6.pLeft=n6.pRight=NULL;
	n7.pLeft=n7.pRight=NULL;
	binaryTreeNode * pRootA=&n1;
	//treeB
	binaryTreeNode m1,m2,m3;
	m1.value=8,m2.value=9,m3.value=2;
	m1.pLeft=&m2,m1.pRight=&m3;
	m2.pLeft=m2.pRight=NULL;
	m3.pLeft=m3.pRight=NULL;
	binaryTreeNode *pRootB=&m1;
	bool result=hasSubtree(pRootA,pRootB);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值