一尘不染

在二叉搜索树中删除

algorithm

我得到了两个二进制搜索树。例如,A和B。接下来,我被要求从树A中删除树B。

删除是指从A中删除B中存在的所有节点。注意:B不一定是A的子树。

例如:
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的根。对于右子树,已删除节点的有序后继服务器应作为树A的根。

A2:另一种方法有点怪异。我找到了树A的有序遍历和预排序遍历。使用二进制搜索和递归查找和删除树B中的所有节点(我们不修改前序)。最后,从inorder(剩余)和preorder(不变)重建bst。

问题A:找到有效的BST方法。
问题B:找到任何二叉树(不仅仅是BST)的有效方法。


阅读 215

收藏
2020-07-28

共1个答案

一尘不染

问题A

我认为两棵树是平衡的。

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实现,因此我无法为您测试代码。但是我认为这个想法是正确的。

问题B

将哈希表用于一棵树,然后遍历另一棵树。您将获得 O(N) 的时间和空间复杂度。

2020-07-28