【问题标题】:Why is my root being set to None?为什么我的根设置为无?
【发布时间】:2015-06-16 05:09:02
【问题描述】:

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

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)

当我在调试器中运行代码时,它显示我的根是无。在我的 add 方法中,我检查根是否为 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

【问题讨论】:

  • 你应该在实例变量中设置root,否则你的Tree实例将共享同一个根

标签: python tree binary-search-tree


【解决方案1】:

问题出在线条上-

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

add() 函数中,您正在检查 root 是否为 none ,但您甚至可能没有在 self 内创建 root 属性。

我猜你没有__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)

【讨论】:

  • 如果self.root is None,怎么会有data属性?
  • 对不起,忘了补充一点,他必须稍微改变 add() 函数,更新答案。
【解决方案2】:

您已将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

【讨论】:

  • 非常感谢,这是一个疏忽,我认为我不会看到,因为直接从 java 翻译。
  • class Tree(object): root = node()self.Node不是同一个变量,第一个是类的静态变量,第二个是实例变量。
猜你喜欢
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多