【问题标题】:Python method is not returning an node object for red black treePython方法没有返回红黑树的节点对象
【发布时间】:2017-10-16 00:47:47
【问题描述】:

我正在用 Python 实现一棵红黑树。我有两个类,RedBlackTree 和 TreeNode。 __setitem__ 是在下面显示的代码之外定义的。

我的代码的问题是,当我尝试将键 -1 添加到我的树时,会在 _put 方法内创建一个 TreeNode 对象,但该对象没有正确返回。调用方方法 'put' 没有收到任何对象。

该代码适用于添加键 52,但由于某种原因,无法以我在下面尝试的方式返回键为 -1 的 TreeNode 对象。查看底部的控制台输出。

非常感谢我们的建议提供的任何帮助。谢谢

class RedBlackTree:
  def put(self, key, val):
    if self.root:
        newNode = self._put(key, val, self.root)
        print("put RECEIVED ", newNode)
        print("put has newNode, who's key is ", newNode.key, 
              " and parent's key is ", newNode.parent.key)
        self.rbInsertFixup(newNode)
    else: # there is no root
        self.root = TreeNode(key, val, parent = self.sentinal, 
                             left = self.sentinal,
                             right = self.sentinal)
        newNode = self.root
        self.rbInsertFixup(newNode)

  def _put(self, key, val, currentNode):
    if key < currentNode.key:
        if currentNode.leftChild != self.sentinal:
            self._put(key, val, currentNode.leftChild)
        else: # currentNode has no child
            newNode = TreeNode(key, val, parent = currentNode, 
            left = self.sentinal, right = self.sentinal )
            currentNode.leftChild = newNode
            print("_put RETURNS ", newNode)
            return newNode
    else: # symetric to THEN clause above, with 'left' chnaged to 'right'
    ...
class TreeNode():
  def __init__(self, key, val, 
             left = None, right = None, 
             parent = None, color = 'red'):
    self.key = key
    self.payload = val
    self.leftChild = left
    self.rightChild = right
    self.parent = parent
    self.color = color
    ...
t = RedBlackTree()
t[5] = 'five'
t[2] = 'two'
t[-1] = 'negative one'

下面的控制台输出...

('_put RETURN ', <__main__.TreeNode instance at 0x106bd45a8>)
('put RECEIVED ', <__main__.TreeNode instance at 0x106bd45a8>)
("put has newNode, who's key is ", 2, " and parent's key is ", 5)
('_put RETURN ', <__main__.TreeNode instance at 0x106bd45f0>)
('put RECEIVED ', None)
Traceback (most recent call last):
  File "RB-Tree.py", line 383, in <module>
    t[-1] = 'negative one'
  File "RB-Tree.py", line 105, in __setitem__
    self.put(k, v)
  File "RB-Tree.py", line 35, in put
    print("put has newNode, who's key is ", newNode.key, " and parent's     key is ", newNode.parent.key)
AttributeError: 'NoneType' object has no attribute 'key'

`

【问题讨论】:

  • 经过进一步测试,我感觉这里的问题与我对 _put 的递归调用有关。

标签: python oop data-structures runtime-error red-black-tree


【解决方案1】:

返回值未存储在此if 子句中

if currentNode.leftChild != self.sentinal:
    self._put(key, val, currentNode.leftChild)

改成

if currentNode.leftChild != self.sentinal:
    newNode = self._put(key, val, currentNode.leftChild)
    return newNode

问题解决了。

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 2015-11-17
    • 2018-05-15
    • 1970-01-01
    • 2014-01-13
    • 2017-03-02
    • 1970-01-01
    • 2011-03-21
    • 2014-01-15
    相关资源
    最近更新 更多