二叉树是否包含在另一个二叉树中 - C.

时间:2009-11-19 05:34:52

标签: c search binary-tree

所以我刚接受了一次采访,我很自信我搞砸了王室。我向你扔了一堆问题,没有足够的时间来回答最后一个问题。

在得到所有开头问题之后,我被要求编写一个函数来确定二叉树b是否包含在另一个二叉树a中。我之前正确编码了这个问题,他要求我写一个函数来确定两棵树是否相等:

int sameTree(struct node *a, struct node *b){
//both empty = TRUE
if(a == NULL && b == NULL)
    return TRUE;
//both not empty, compare them
else if(a != NULL && b != NULL){
    return(
    a->data == b->data &&
    sameTree(a->left, b->left) &&
    sameTree(a->right, b->right)
    );
}
//one empty, one not = FALSE
else 
    return FALSE;

}

唉。只是为了清除我的良心,你又如何确定树b是否在树内?

感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

int in(struct node* outer, struct node* inner){
    if(inner == null){
        return true; // say every tree contains the empty tree
    } else if(outer == null){
        return false;
    } else if(same(outer, inner)){
        return true;
    } else return in(outer->left, inner) || in(outer->right, inner);
}

我们不能使用OP的sameTree,而是使用此函数:

int same(struct node* outer, struct node* inner){
    return !inner || outer && outer->data == inner->data && same(outer->left, inner->left) && same(outer->right, inner->right);
}

或者,更详细地说,

int same(struct node* outer, struct node* inner){
    if(inner == null){
        return true;
    } else if(outer == null){
        return false;
    } else if(outer->data == inner->data){
        return same(outer->left, inner->left) && same(outer->right, inner->right);
    } else return false;
}

答案 1 :(得分:1)

这假设您希望具有相同结构的相同树,包含在a

例如,如果b为空且a不为,则包含b(您应该在上一个else中检查)。
其次,这些不是二叉搜索树(未排序),因此要检查b是否在a内,你还应该遍历a(假设你重命名该函数):

int containsTree(struct node *a, struct node *b){
//both empty = TRUE
if(a == NULL && b == NULL)
        return TRUE;
//both not empty, compare them

else if(a != NULL && b != NULL){
    return(
      // sameTree should be changed to allow nulls, as below
      sameTree(a, b)
      // check recursively
      || containsTree(a->left, b)
      || containsTree(a->right, b)
    );
//one empty, one not = FALSE
else 
    return B == NULL;

答案 2 :(得分:1)

要检查树A中是否按原样包含树B,请在C中找到B中的节点C.data == A.dataA。如果没有此类节点,则B中不包含C。如果存在A,请使用修改后的C函数检查sameTree和{{1}}是否相等 - 忽略A的空子项与C的非空子项之间不匹配的函数如果A.left / right为null,则返回true。

感谢@Kobi进行更正。