美文网首页C算法&面试题程序员
判断树A是否为另一树B的子结构

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

作者: AwesomeAshe | 来源:发表于2016-03-11 20:53 被阅读131次

题目的意思:

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);
}

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

欢迎讨论!

文章参考何海涛大神文章

相关文章

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

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

  • 【剑指Offer学习】【面试题18 :树的子结构】

    题目: 输入两棵二叉树A 和B,判断B 是不是A 的子结构。 思路: 要查找树A 中是否存在和树B 结构一样的子树...

  • 面试题26:树的子结构

    该题的思路应该使用递归来判断,通过判断左子树和右子树来判断树是否是子结构,当子结构为空时,则判断成功

  • 面试题26. 树的子结构

    题目 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中...

  • 面试题26. 树的子结构

    题目描述 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 ...

  • 面试题26.树的子结构_hn

    题目描述 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 ...

  • 算法-26.树的子结构

    输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现...

  • 剑指 Offer 26. 树的子结构

    题目 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有...

  • 面试题26. 树的子结构

    题目描述: 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即...

  • 剑指 Offer 26 树的子结构

    题意:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有...

网友评论

    本文标题:判断树A是否为另一树B的子结构

    本文链接:https://www.haomeiwen.com/subject/lzkxlttx.html