题目:输入两棵二叉树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); if(!result) //当所有左子树没有匹配到我们就开始匹配右子树,直到所有的结点遍历完。 result=HasSubTree(pRoot1->RightTree,pRoot2); } 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); //用&&对左右两边都进行判断 }