首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“封顶”二叉搜索树(移除所有元素>封顶)

“封顶”二叉搜索树(移除所有元素>封顶)
EN

Stack Overflow用户
提问于 2017-02-06 05:19:36
回答 2查看 255关注 0票数 1

我想不出一个递归算法来做这件事。我的尝试是:

代码语言:javascript
复制
void capValue(Node node) {

    if (node == null)
        return

    if (node.element > cap)
        capValue(node.left)
        node = null;
    else // node.element < cap
        capValue(node.right)
}

然而,你不能只是把节点空出来(至少在java中,我想把它写进去),因为这只会把当前指针移到地址0,而我们想要删除的对象仍然有一个通过树根指向它的“指针路径”,因此不会被垃圾回收。

EN

回答 2

Stack Overflow用户

发布于 2017-02-06 06:23:36

您可以从函数中返回节点。可以是这样的:

代码语言:javascript
复制
Node cap(Node node, int val)
    // There's no node. There's nothing to cap.
    if (node == null)
        return null;
    // The node and it's left subtree should stay
    if node.key <= val {
        node.right = cap(node.right, val);
        return node;
    }
    // The node and it's right subtree must be deleted,
    // so we can go to the left subtree
    return cap(node.left, val);

在后面的代码中,应该像root = cap(root, val)一样调用它。

票数 0
EN

Stack Overflow用户

发布于 2017-02-06 13:32:58

这应该是可行的。我们将首先找到较大的节点,然后将父链接更新为null。如果根节点本身大于cap,则将其设为空。

代码语言:javascript
复制
boolean capValue(Node node) 
{
if (node == null)
    return false;

if (node.element > cap) {
node = null;
return true;            
}
else {// node.element < cap 
     if(capValue(node.right))
     node.right=null;
     return false;  
}    
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42057429

复制
相关文章

相似问题

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