题目:输入两棵二叉树A和B,判断B是不是A的子结构
分析:根据数的遍历方法,首先想到的是采用递归的方式要更简单些,树A从根节点进行遍历,首先判断与B的根节点值是否相等,如果相等则进行递归遍历验证,否则验证树A的其他节点,直到所有的结点遍历完。
注意的就是指针是否为NULL,因为自己编程能力不好,所以有些很简单的也做了注释,方便以后自己理解。
//判断B是不是A的子树
struct BinaryTree{
int m_value;
BinaryTree * LeftTree;
BinaryTree * RightTree;
};
bool DoesHasSubTree(BinaryTree *pRoot1,BinaryTree *pRoot2);
bool HasSubTree(BinaryTree * pRoot1,BinaryTree * pRoot2)
{//当结点不相同的时候怎么去遍历其他的结点呢?
//这里采用的方法是设置一个result,当result=false时候我们并不是直接结束程序,而是继续去遍历其他点,直到所有的点都遍历完
//这里hasSubTree函数主要是为了遍历结点,而真正进行匹配是由函数DoesHasSubTree来实现
bool result=false;if(pRoot1!=NULL&&pRoot2!=NULL) //除此之外的所有情况我们都认为是不包含子树的,条件是不能丢的
{
if(pRoot1->m_value==pRoot2->m_value) //一旦查到有结点相同,就进行递归遍历进行匹配见下面函数
result=DoesHasSubTree(pRoot1,pRoot2) //这个函数式递归函数,所以在里面还需要进行判断pRoot1->m_value==pRoot2->m_value是否相等
if(!result) //遍历了根节点接下来从左子树开始遍历,(递归的作用是左子树变成根节点进行匹配。)有点类似深度优先搜索。
result=HasSubTree(pRoot1->LeftTree,pRoot2->LeftTree);
if(!result) //当所有左子树没有匹配到我们就开始匹配右子树,直到所有的结点遍历完。
result=HasSubTree(pRoot1->RightTree,pRoot2->RightTree);
}
return result;//返回最终的结果
}
bool DoesHasSubTree(BinaryTree *pRoot1,BinaryTree *pRoot2)
{
if(pRoot2==NULL) //当子树遍历完的标志,可以遍历完说明过程中没有碰到false条件,也就是都是匹配的
return true;
if(pRoot1==NULL)
return false;if(pRoot1->m_value!=pRoot2->m_value)
return false;
return DoesHasSubTree(pRoot1->LeftTree,pRoot2->LeftTree)&& DoesHasSubTree(pRoot1->RightTree,pRoot2->RightTree); //用&&对左右两边都进行判断
}
判断A树是否包含B树结构