【问题标题】:How can I make a tree Node object display its contents when printed?如何让树节点对象在打印时显示其内容?
【发布时间】:2015-08-29 04:20:28
【问题描述】:

当我们调用查找方法时会发生此错误。谁能说如何纠正?我无法使用可用的在线文档对其进行调试。这是一个二叉树类的实现。我知道这与等价问题有关。

import deque

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

    def insert(self, data):    
        if data < self.data:
            if self.left is None:
                self.left = Node(data)
            else:
                self.left.insert(data)
        else:
            if self.right is None:
                self.right = Node(data)
            else:
                self.right.insert(data)  

    def lookup(self, data, parent=None):    
        if self.data == data:
            return self, parent
        if data < self.data:
            if self.left is None:
                return None
            else:
                return self.left.lookup(data, parent=self)
        else:
            if self.right is None:
                return None
            else:
                return self.right.lookup(data, parent=self)

    # aka bfs traversal
    def level_traversal(self):    
        root = self
        dq = deque()
        dq.append(root)
        while dq:
            root = dq.popleft()
            if root.left:
                dq.append(root.left)
            if root.right:
                dq.append(root.right)
            print (root.data)



    def delete(self, data):
        node, parent = self.lookup(data)
        if node.children_count() == 0:
            if parent.left == node:
                parent.left = None
            else:
                parent.right = None
            del node
        elif node.children_count() == 1:
            if node.left:
                n = node.left
            else:
                n = node.right
            if parent:
                if parent.left == node:
                    parent.left = n
                else:
                    parent.right = n
            del node
        else:
            # find the successor
            parent = node
            successor = node.right
            while successor.left:
                parent = successor
                successor = successor.left

            node.data = successor.data
            if parent.left == successor:
                parent.left = successor.right
            else:
                parent.right = successor.right

    def inorder(self):    
        if self.left:
            self.left.inorder()

        print (self.data)

        if self.right:
            self.right.inorder()

    def preorder(self):    
        print (self.data)
        if self.left:
            self.left.preorder()
        if self.right:
            self.right.preorder()

    def postorder(self):    
        if self.left:
            self.left.postorder()
        if self.right:
            self.right.postorder()
        print (self.data)


root = Node(8)
root.insert(3)
root.insert(10)
root.insert(1)
root.insert(6)
root.insert(4)
root.insert(7)
root.insert(14)
root.insert(13)

# look up
print (root.lookup(6))
# level traversal
root.level_traversal()
#mirror image
#root.mirror_image()
#root.delete(3)
#root.level_traversal()

# inorder
#root.inorder()
# pre order
#root.preorder()
# postorder
#root.postorder()
# size
#root.size()
#root.dfs()
#print root.height()

【问题讨论】:

  • 这不是错误……
  • 我知道。请给我更正后的代码
  • 当您已经知道某事不是错误时将其称为错误会误导和混淆。
  • 兄弟,我是 python 新手。请帮助我如何纠正错误
  • 我只能建议您 1) 阅读 Simon Zhu 在他的答案中链接到的文档,2) 查看我链接到的示例,以及 3) 尝试编写自己的简单示例,直到您了解发生了什么为止。

标签: python class binary-search-tree


【解决方案1】:

这根本不是错误。发生这种情况是因为您从查找方法返回了一个对象元组,而这正是您将对象打印出来时的表示方式。如果你不喜欢这样,你可以覆盖__repr__() 方法。

【讨论】:

  • 我已经编辑了我的答案以包含指向 __repr__() 的 Python 文档的链接。阅读它,看看你是否能自己弄清楚。在寻求帮助之前先自己尝试总是一个好主意:)
  • 兄弟,我的时间不多了。至少请给我一些例子,以便我容易理解
  • @HaiHai:请查看关于此主题的许多个现有问题之一,例如Purpose of Python's __repr__
  • @HaiHai 文档很清楚,不是吗?您必须从 __repr__() 方法返回一个字符串。例如,return str(self.data)
  • @HaiHai:看看我前段时间写的this example,里面有__str__()__repr__()的例子。或者你可能想试试这个,我在我自己的二叉树类中使用它:def __repr__(self):return '(%s, %r, %r)' % (self.data, self.left, self.right)
【解决方案2】:

在你的类定义中试试这个。

二叉树节点的定义

class TreeNode:
  def __init__(self, val = 0, left = None, right = None):
    self.val = val
    self.left = left
    self.right = right

  ## print TreeNode Object
  def __repr__(self) -> str:
      return '[%s, %r, %r]' % (self.val, self.left, self.right)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2012-05-27
    相关资源
    最近更新 更多