首页 > 解决方案 > 二叉树不显示节点存在 Python

问题描述

insert我正在尝试使用andpreorder方法实现二叉树。

将元素添加到树后,仅显示一个元素。

有人可以让我知道我错在哪里。

下面是代码:

class Node(object):

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

    def __repr__(self):
        return '{}'.format(self.value)

class BinaryTree(object):

    def __init__(self, root=None):
        self.root = root

    def add(self, value):
        val = self.root
        if not val:
            self.root = value
            val = value

        elif not val.left:
            val = value
        elif not val.right:
            val = value
        else:
            self.left = val.left.add(value)
        return val

    def preorder(self):
        val = self.root
        if not val: # this will handle the case when root node is None.
            return 
        print(val)
        if val.left:
            val.left.preorder()
        if val.right:
            val.right.preorder()


def main():

    binary_tree = BinaryTree()

    print("Adding nodes to the tree")
    for i in range(1, 11):
        node = Node(i)
        binary_tree.add(node)

    print("Printing preorder...")
    binary_tree.preorder()

if __name__ == '__main__':
    main()

输出

Adding nodes to the tree
Printing preorder...
1

标签: pythonbinary-tree

解决方案


您的代码有几个不同的错误。有些与您如何修改self.root(或失败)有关,有些与尝试递归错误类型有关。

第一个问题,这就是您的代码静默失败的原因,与您的BinaryTree.add方法有关,当树为空时,它什么也不做。问题是您将一个局部变量初始化val为等于您的根节点(如果有的话),然后将其重新绑定到其他值。但这根本不会改变根值,只会改变局部val变量。

建议大家一起去掉,直接val读写self.root。然后你实际上会取得一些进展,并看到其他问题。

这是一个开始:

def add(self, value):
    if self.root is None:
        self.root = value
    elif self.root.left.left is None:
        self.root.left = value
    ...

我提到的其他问题都是相似的,尽管一个发生BinaryTree.addBinaryTree.preorder. 问题是您尝试在根节点的其中一个子节点上调用相同的方法(add或)。preorder但是节点是Node实例,并且没有您在BinaryTree类中定义的方法。

这个问题没有上一个那么明显的解决方案。一个想法可能是将方法的逻辑移到Node类中(您可以轻松地递归),并在BinaryTree方法中只保留空树处理代码(其他所有内容都委托给根节点)。


推荐阅读