首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在二叉树中删除

问在二叉树中删除
EN

Stack Overflow用户
提问于 2011-08-31 09:06:05
回答 2查看 3.4K关注 0票数 7

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

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

例:

答:

50 / \ 10 75 / / \ 1 60 90

B:

10 / \ 1 75

由此产生的树应该是:

50 \ 60 \ 90

我想到了两种方法:

A1:

节点*deleteTree(节点* A,节点* B);

取树根B。从树A中删除此节点(通过正常的BSt删除方法)。接下来,将问题分为两部分: B的左子树和B的右子树,每个子树都是recurse。对于左子树,占据被删除节点的节点应作为树A的根。对于右子树,删除节点的顺序继承者应作为树A的根。

A2:另一种方法有点奇怪。我发现A树的无序遍历和前置遍历,使用二进制搜索和递归(我们不修改预顺序)查找和删除B树中的所有节点。最后,从无序(剩余)和预置(不变)重新构造我们的bst。

问题A:为BST找到一个有效的方法。

B:为任何二叉树(不仅仅是BST)寻找一种有效的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-31 13:12:58

问题A

我想这两棵树是平衡的。

代码语言:javascript
复制
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);
    }
}

时间复杂性:

代码语言:javascript
复制
T(N) = 2 * T(N / 2) + O(1)

因此,根据主定理,总体复杂度是O(N)。空间复杂度为O(1)。一个缺点是我毁了B。

PS:我手头没有BST实现,所以我不能为您测试代码。但我认为这个想法是正确的。

问题B

对一棵树使用哈希表,并遍历另一棵树。您将得到时间和空间复杂度的O(N)。

票数 7
EN

Stack Overflow用户

发布于 2011-08-31 09:27:37

在我看来,为什么不按顺序遍历b。然后,直到数组不为空为止,对数组索引的值执行一个常规的删除。遍历是O(n),每个索引的删除将是O(logn)。总之,这个操作将是O(nlogn)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7254808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档