判断树A是否为另一树B的子结构

题目的意思:

Paste_Image.png

首先直观的想到,我们先在A中找到B的根节点,然后递归的检查B所有的节点是否在A中相同的位置:

//check if t1 has t2
//在这个函数里面,我们有很多出口,不满足条件的直接return false出去,这样写简单
bool partOfTree(treeNode* t1, treeNode* t2)
{
    if (!t1)
        return false;
    if (!t2)
        return true;//only branch that returns true

    if (t1->data != t2->data)
        return false;
    
    return  partOfTree(t1->lNode, t2->lNode)&&partOfTree(t1->rNode, t2->rNode);
//这个return写的好

}

这个函数就是检查,当在A中找到B的根节点之后做的事情。我只需要返回是否相等就行。

然后就是,在A中找B的根节点然后调用上面的函数判断:
注意事项见注释,我有一个误区就是如果在A找到了根节点然后判断不相等就直接退出,但是A中可能有多个和B根节点值相同的节点啊,所以这个不满足后面接着判断。
除非题目说明是特殊的每个元素只出现一次的树。

bool hasSubTreeCore(treeNode* t1, treeNode* t2)//find the root node of tree2 in tree1
{
    bool result = false;

    if (t1->data == t2->data)
        result= partOfTree(t1, t2);
    //注意这里不要直接返回!   因为当前的这个节点不符合,可能下面还有相同值的节点!

    if (!result&&t1->lNode)
        result = hasSubTreeCore(t1->lNode, t2);
    if (!result&&t1->rNode)
        result = hasSubTreeCore(t1->rNode, t2);

    return result;//统一的函数出口
}

最后完整的函数还有一个驱动程序,这个函数主要是排除一些非法的输入

bool hasSubTreeCore(treeNode*,treeNode*);
bool hasSubTree(treeNode* t1, treeNode* t2)//这个函数在于排除掉一些不符合要求的输入。
{
    if (!t1&&!t2)
        return true;
    if (!t1&&t2 || !t2&&t1)
        return false;

    return hasSubTreeCore(t1,t2);
}

另外,如果题目给定的树是一个二元查找树的话,也就是查找根节点方便一点,然后判断只需要判断一次,其他的应该都一样吧。

欢迎讨论!

文章参考何海涛大神文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容