【问题标题】:Unable to delete a node in Binary tree无法删除二叉树中的节点
【发布时间】:2019-12-28 08:36:25
【问题描述】:

我正在尝试删除二叉树最右边的节点。我正在使用一个函数来找到最右边的节点,它正确地返回了二叉树的最右边的节点,然后我分配了空值。但是当我打印二叉树时,最右边的节点的值被打印出来了。请帮助我理解为什么会这样。

    void deleteNode(Node root, int Key)
{

    Node rightMost = rightmost(root); // returns the right most node
    rightMost = null

}

如果我要删除从父节点到最右边子节点的链接,则该节点将被删除,但当我将节点本身设为空时不会。这很令人困惑,因为如果节点本身为空,那么它应该被删除。

【问题讨论】:

  • 欢迎。这是什么语言?在大多数语言中,仅将 null 分配给变量只会取消设置引用,不会删除任何内容。
  • 我用java写了这段代码
  • 遍历右节点,直到你发现该节点为空,然后确保你的树是第一个你迭代的不是你从rightmost得到的那个
  • 如果我从函数返回同一个最右边的节点并将其分配为空,那么为什么它没有发生。最后是同一个节点。
  • 请发帖minimal reproducible example显示问题

标签: java binary-tree


【解决方案1】:

棘手的部分是 Java 本质上为您提供了一个指向最右边节点的 指针,然后您将其设置为 null。

解释一下:

Node rightMost = rightmost(root); // returns the right most node

rightMost 现在是一个只包含内存地址的变量,例如0x0123456。所以当你说:

rightMost = null

实际发生的是它获取节点的最右边地址并将其复制到此变量rightMost 中。然后,您将此副本设置为 null,而不是实际的底层最右边节点。

类比:我可以在我的通讯录中设置 John Smith 的家庭地址为 1234 State Street。但是,如果我将联系人中 John Smith 的地址更改为 2345 Main Street,这实际上不会导致 John 搬家!我只是在更新我对约翰家在哪里的内部参考。这里也一样。

Java 确实很棘手,因为它是按值传递的,但值是一个引用。我强烈推荐阅读thisthis

要真正按照您的要求进行操作,您需要能够访问底层属性并进行设置,如下所示,其中node 是最右边节点的父节点:

node.right = null

或者您可以使用某种设置器将最右边的节点设置为指定值。如果您无法使用 setter 或直接访问属性来设置变量,那么从您的角度来看,它是只读

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多