您的位置:首页 > 理论基础 > 数据结构算法

判断一棵树是不是另一棵树的子树

2017-03-19 09:36 246 查看

判断一棵树是不是另一棵树的子树

平台:VS2013

我们知道,根据一个树的中序遍历与前序遍历可以重建一棵二叉树(在没有重复数据的情况下),因此我们可以根据这一思想来判断另一棵树是否是它的子树,然而,由于中序遍历与前序遍历的时间复杂度是O(n),在加上两个树的匹配,即使使用KMP,时间复杂度也有O(m+n),因此采用这种方法的效率是很低的。在这里,我们有一种效率更高的方法,即直接对树与子树进行遍历寻找,核心思想为:先比较两树的根节点的元素是否相同,如果相同则调用一个处理相同情况的函数来处理,如果不同,则先从父树的左孩子与该子树进行比较(这里主要是递归调用),如果还是不同,则比较右孩子与该子树比较,如果还不同,则返回false。不多说了,代码如下

bool isPart(TreeNode* pRoot1, TreeNode* pRoot2){
if(pRoot2 == nullptr) return true;
if(pRoot1 == nullptr)return false;
if(pRoot1->val != pRoot2->val)return false;
return isPart(pRoot1->left, pRoot2->left)&&isPart(pRoot1->right, pRoot2->right);

}

bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
bool result=false;
if(pRoot1!=nullptr && pRoot2!=nullptr){
if(pRoot1->val == pRoot2->val) result =  isPart(pRoot1, pRoot2);
if(!result) result = HasSubtree(pRoot1->left, pRoot2);
if(!result) result = HasSubtree(pRoot1->right, pRoot2);
}
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息