我得到了两个二叉搜索树。例如,A和B.接下来,我被要求从树A中删除树B.
通过删除,我的意思是从A中删除B中存在的所有节点。 注意:B不一定是A的子树。
例如:
答:
50 / \ 10 75 / / \ 1 60 90
B:
10 / \ 1 75
结果树应该是:
50 \ 60 \ 90
我想到了两种方法:
A1:
node * deleteTree(node * A,node * B);
取树B的根。从树A中删除此节点(通过正常的BSt删除方法)。接下来将问题分为两部分 - B的左子树和B的右子树。对于每个子树,递归。对于左子树,占用已删除节点的节点应作为树A的根。对于右子树,已删除节点的inorder后继应作为树A的根服务。
问题答:找到一种有效的BST方式 问题B:为任何二叉树(不仅仅是BST)找到一种有效的方法。
答案 0 :(得分:7)
我认为这两棵树是平衡的。
void deleteTree(node* A, node* B)
{
if(A == NULL || B == NULL)
return;
if(A->data == B->data)
{
deleteTree(A->left, B->left);
deleteTree(A->right, B->right);
removeNode(A); // Normal BST remove
}
else if(A->data > B->data)
{
Node* right = B->right;
B->right = NULL;
deleteTree(A->left, B);
deleteTree(A, right);
}
else // (A->data < B->data)
{
Node* left = B->left;
B->left = NULL;
deleteTree(A->right, B);
deleteTree(A, left);
}
}
时间复杂度:
T(N) = 2 * T(N / 2) + O(1)
根据主定理,总体复杂度为 O(N)。空间复杂度 O(1)。一个缺点是我破坏了B。
PS:我手头没有BST实现,所以我无法为您测试代码。但我认为这个想法是正确的。
对一棵树使用哈希表并遍历另一棵树。对于时间和空间复杂性,您将获得 O(N)。
答案 1 :(得分:0)
我看到它的方式,你为什么不进行b的顺序遍历。然后,在数组不为空之前,从a中定期删除数组索引的值。遍历为O(n),每个索引的删除将为O(logn)。总的来说,这个操作将是O(nlogn)。