引用传递给函数Python的对象

时间:2016-04-25 18:55:45

标签: python binary-search-tree

为了更多地了解Python的对象和类,我为二进制搜索树编写了一些代码。

对于删除方法,当我尝试更改节点指向的内容时,python正在创建一个新变量,而不是更改传递给该方法的节点。我怎样才能更改方法中指向的节点?

class Node:

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


class BST:

def __init__(self):
    self.root = None
    self.length = 0

def insert(self, data):

    if not self.root:
        temp = Node()
        temp.data = data
        self.root = temp
    else:
        return self._insert(self.root, data)

def _insert(self, node, data):

    if node.data <= data:
        if not node.right:
            temp = Node()
            temp.data = data
            node.right = temp
            return
        else:
            self._insert(node.right, data)
    else:
        if not node.left:
            temp = Node()
            temp.data = data
            node.left = temp
            return
        else:
            self._insert(node.left, data)

def delete(self, data):

    return self._delete(self.root, data)

def _delete(self, node, data):

    if not node:
        return False
    elif node.data < data:
        return self._delete(node.right, data)
    elif node.data > data:
        return self._delete(node.left, data)
    else:
        if not node.left and not node.right:
            node = None
        elif not node.left:
            node = node.right
        elif not node.right:
            node = node.right
        else:
            temp = self.findmin(node.right)
            #or find max of left
            node.data = temp.data
            self._delete(node.right, temp.data)

def findmin(self, node):
    if not node:
        return None
    while node.left:
        node = node.left
    return node

1 个答案:

答案 0 :(得分:0)

这不是python问题,对于使用指针的每一种语言(而不是c ++样式引用),这都是相同的。在删除操作期间,您应该将节点引用的指针更改为其子项。你有一个结构

       parent
       /   \
     node  ...
     /  \
child1  child2

删除node时,您必须将子项更改为新项目,而不是尝试将新值分配给&#34;节点&#34;变量,不指向任何地方。因此,你最终会得到类似的东西:

       parent
       /    \
     child1  ...
     /  \
child2  ...