为什么我的root被设置为None?

时间:2015-06-16 05:09:03

标签: python tree binary-search-tree

我无法理解为什么我的根节点被设置为None。以下是树实现的一部分。

class Node(object):
    def __init__(self, d=None):
        self.left = None
        self.right = None
        self.data = d


class Tree(object):
    root = Node()

    #methods to add data to to the binary search tree
    def add(self, d):
        node_to_add = Node(d)
        if self.root is None: 
            self.root.data = node_to_add
        self._traverse_and_add(self.root, node_to_add)

    def _traverse_and_add(self, node, new_node):
        if new_node.data < node.data:
            if node.left is None:
                node.left = new_node
            else:
                self._traverse_and_add(node.left, new_node)

        elif new_node.data > node.data:
            if node.right is None:
                node.right = new_node
            else:
                self._traverse_and_add(node.right, new_node)

当我在调试器中运行代码时,它显示我的根是None。在我的add方法中,我检查root是否为None,如果是,我希望root.data取值d。在根填充后它不是无,然后它可以相应地添加数据。我在Java中使用类似的方法我没有这个问题。此错误成为后续方法的问题,例如查找深度。如果我使用填充树

,这是我得到的视觉效果
t = Tree()
t.add(10)
t.add(2)
t.add(11)


result = 
  None
   /\
  2 10
     \
      11

expected =
   10
   /\
  2 11

2 个答案:

答案 0 :(得分:2)

问题在于 -

if self.root is None: 
    self.root.data = node_to_add

add()功能中,您正在检查root是否为空,但您甚至可能无法在root内创建self属性。

我猜你没有__init__功能。您需要__init__函数,其代码如下 -

def __init__(self):
    self.root = None

您还需要更改添加功能,如下所示 -

def add(self, d):
    node_to_add = Node(d)
    if self.root is None: 
        self.root = node_to_add
    self._traverse_and_add(self.root, node_to_add)

答案 1 :(得分:1)

您已将root设为Node()

class Tree(object):
    root = Node()

但是在这里你检查它是None

def add(self, d):
    node_to_add = Node(d)
    if self.root is None:  # it is not None, it is Node()

此外,您没有任何__init__方法。您应该在那里定义实例变量。

def __init__(self):
    self.root = Node()

所以,现在你可以修改你:if self.root.data is None