【问题标题】:How to delete a node from a tree. I am trying to delete the node from the function but still it is getting print even after deleting如何从树中删除节点。我正在尝试从函数中删除节点,但即使在删除后它仍在打印
【发布时间】:2022-01-18 08:16:38
【问题描述】:

我正在从删除函数中删除节点,当在函数中打印它时显示它的无

但是当函数完成后,它会打印出值 请纠正我,告诉我这段代码有什么问题

注意:类节点只有init方法,其他函数在类外

class Node:

    def __init__(self,data):
        self.data = data
        self.left = None
        self.right = None 

def printit(obj):

    if obj:
        printit(obj.left)
        print(obj.data)
        printit(obj.right)
    return

def insert(obj, data):

    if obj.left == None:
        obj.left = Node(data)
        return
    
    if obj.right == None:
        obj.right = Node(data)
        return
    
    insert(obj.left, data)
    

def delet(obj):

    if obj.left == None:
        obj= None
        return
    delet(obj.left)     
f = Node(50)

f.left = Node(15)

f.right = Node(75)

delet(f)

printit(f)

【问题讨论】:

  • 您希望delet 做什么?如果obj.right 不是None 怎么办?

标签: python tree binary-tree binary-search-tree


【解决方案1】:

obj= None 只影响该name 的值。它不会影响与 obj 先前值相关的任何内容。

如果你想改变树结构,你必须分配一个属性,而不是一个变量名。

想想当最最后一个节点被删除时会发生什么:然后主程序应该将其f设置为None。只有当你返回调用者可以分配回他们自己的变量的东西时,才会发生这种情况。

例如:

def delet(obj):
    if obj.right is not None:
        obj.right = delet(obj.right)
    elif obj.left is not None:
        obj.left = delet(obj.left)
    else:
        return None
    return obj

您还应该在主代码中使用返回值:

f = Node(50)
f.left = Node(15)
f.right = Node(75)
printit(f)
print("---")

f = delet(f)
printit(f)
print("---")

f = delet(f)
printit(f)
print("---")

f = delet(f)
printit(f)
print("---")

【讨论】:

  • 我得到了这个,但是当我使用 insert 时,它也能正常工作。为什么?因此,即使在插入新值时,它也应该添加该值,但在函数之外它不应该打印新树,对吧?
  • 我不明白你在说什么。当您调用insert 时,它会影响树,因为insert 会分配给节点的属性。如果您想将None 作为第一个参数传递给insert,以创建树的first 节点,那么您需要return 新的根,并应用与我在delet 中所做的相同的原则。两者都不需要。
  • 是的,我现在知道了,非常感谢 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 2019-04-19
  • 2021-09-20
  • 1970-01-01
相关资源
最近更新 更多