所以,我有明显的蛮力算法,如下
int isSubtree (binTree *S, binTree *T)
{
if (S == NULL)
return 0;
return (isEqual (S,T) || isSubtree (S->left, T) || isSubtree (S->right, T));
}
int isEqual (binTree *S, bintree *T)
{
if (S==NULL && T==NULL)
return 1;
if (S==NULL || T==NULL)
return 0;
if (S->val == T->val)
return isEqual(S->left,T->left) && isEqual (S->right,T->right);
else
return 0;
}
但这是 O(n²) 方法。
我有另一种方法,如下所示,是 O(n) 我们以中序方式遍历第一棵树并将其存储在数组中。然后我们遍历第二棵树并以有序的方式存储它。现在,如果第二个数组是第一个数组的子数组,我们继续并重复相同的过程来进行前序遍历。如果两个查询的结果都是 TRUE,则树是第一棵树的子树。否则,不会。
有人可以告诉我以下算法是否有效吗?
是否有针对此问题的空间优化解决方案?
注意:我需要两个数组,因为我存储了两个数组的遍历,无论如何我可以只使用一个数组吗?就像我会存储其中一棵树的中序遍历,然后在遍历另一棵树时使用该数组检查子数组条件。或者可能没有额外的空间,但 O(n) 时间复杂度?
注意:通过子数组,我的意思是元素应该连续出现,即
{2,3,5} is a subarray of {1,2,3,5} but not a subarray of {1,2,3,4,5}