所以我刚接受了一次采访,我很自信我搞砸了王室。我向你扔了一堆问题,没有足够的时间来回答最后一个问题。
在得到所有开头问题之后,我被要求编写一个函数来确定二叉树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是否在树内?
感谢任何帮助。
答案 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.data
,A
。如果没有此类节点,则B
中不包含C
。如果存在A
,请使用修改后的C
函数检查sameTree
和{{1}}是否相等 - 忽略A的空子项与C的非空子项之间不匹配的函数如果A.left / right为null,则返回true。
感谢@Kobi进行更正。