【问题标题】:How to access an attribute of different class in python如何在python中访问不同类的属性
【发布时间】:2022-01-16 17:23:07
【问题描述】:

我正在尝试形成二叉搜索树并打印它。我收到以下错误:

self.root.left.printtree() AttributeError: 'Node' object has no attribute 'printtree'
class Node:
    def __init__(self,data):
        self.data=data
        self.left=None
        self.right=None

class Binarysearchtree():
    def __init__(self,data):
        self.root=Node(data)
        
    def insert(self,data):
        if self.root.data>data:
            if self.root.left==None:
                self.root.left=Node(data)
            else:
                self.root.left.insert(data)
        elif self.root.data<data:
            if self.root.right==None:
                self.root.right=Node(data)
            else:
                self.root.right.insert(data)
        else:
            self.root.data=data
        
    def printtree(self):
        if self.root.left:
            self.root.left.printtree()
        print(self.root.data)
        if self.root.right:
            self.root.right.printtree()
           
a=Binarysearchtree(23)
a.insert(20)
a.insert(24)
a.printtree()

【问题讨论】:

  • 缩进在 Python 中很重要。上面的代码有不同级别的缩进,这使得你很难理解你想要做什么。您应该编辑问题并确保缩进确实与您正在执行的操作相匹配。
  • 您已经在树上而不是在节点上定义了printtree 方法......并且您正在节点上调用它。要么在节点上定义它,要么让它接受一个节点作为参数。

标签: python class binary-tree binary-search-tree


【解决方案1】:
class Node:

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

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

class BinarySearchTree:

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

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

    def print_tree(self):
        self.root.print_tree()


a = BinarySearchTree(23)

a.insert(20)
a.insert(24)

a.print_tree()

您需要将print_tree 函数放入Node 类中。您还必须更改您的print_tree 函数BinarySearchTree 并且您必须使用Nodeprint_tree 函数

不要忘记尊重snake case 约定

【讨论】:

  • 一旦您尝试插入更多项目,insert() 就会出现同样的问题。 (另外,您更改了原始的打印顺序)。
  • 确实,我并没有真正检查过他的insert() 函数。你说得对,它的效果不太好
  • 所以最好对节点和树使用相同的类?我是 python 类的新手
  • @vinoths,是的,将这些方法放在 Node 类上并使用 Tree 类作为包装器来跟踪根会更方便。然后树上的insert() 看起来像:def insert(self,data): self.root.insert(data)。真正的逻辑在节点上。
  • 谢谢马克,我会努力的。
【解决方案2】:

你可以这样创建 BST

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

def createNode(root_node, data):
    while(root_node != None):
        if data < root_node.data:
            if root_node.left == None:
                root_node.left = Node(data)
                break
            else:
                root_node = root_node.left
        else:
            if root_node.right == None:
                root_node.right = Node(data)
                break
            else:
                root_node = root_node.right


#In order Traversal
def inOrderTravel(r):
    if r == None:
        return
    inOrderTravel(r.left)
    print(r.data)
    inOrderTravel(r.right)


class Binarysearchtree:

    def __init__(self,data):
        self.root = Node(data)
        
    def insert(self,data):
        if data < self.root.data:
            ref_root = self.root
            createNode(ref_root, data)  
        else:
            ref_root = self.root
            createNode(ref_root, data)
        return self.root
        


a = Binarysearchtree(23)
r = a.insert(20)
r = a.insert(24)
r = a.insert(25)
r = a.insert(0)
inOrderTravel(r)

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 2018-02-26
相关资源
最近更新 更多