//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;
}
判定是否为子树
最新推荐文章于 2020-08-03 19:36:57 发布