【问题标题】:What is wrong with my insert BST implementation in Python?我在 Python 中的插入 BST 实现有什么问题?
【发布时间】:2026-01-01 09:10:01
【问题描述】:

我正在尝试实现 BST,但我的树的头部值每次都返回 None。我尝试在 Python 中查找其他实现,但它们通常只是声明一个根并将其传递到类本身之外,而不是将头部自身包含在类中。

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
    def __repr__(self):
        return self.data
    def __str__(self):
        return str(self.data)

class Tree:
    def __init__(self, nodes):
        self.head = None
        if nodes is not None:
            for elem in nodes:
                self.insert(self.head, elem)
        print(self.head) #prints out None every time

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

    def inOrder(self, data=None, visitedHead=False):
        if not visitedHead:
            self.inOrder(self.head.left, True)
            print(self.head)
            self.inOrder(self.head.right, True)
        elif(data == None): return
        else:
            self.inOrder(data.left, True)
            print(data)
            self.inOrder(data.right, True)

treeTime = Tree([1, 80, 3, 0])

【问题讨论】:

  • 您在代码中的哪个位置实际上将任何内容分配给self.head?这个currentNode = Node(data) 只创建了一个局部变量,它实际上并没有将任何东西附加到你的树上。

标签: python data-structures binary-search-tree


【解决方案1】:

正如@MarkMeyer 指出的那样,currentNode = Node(data) 只创建一个局部变量。因此,您需要将 curretNode 变量返回给调用者,并通过返回的变量更新节点。

当你修复四行(#1 到 #4)时,你会得到想要的结果。

class Tree:
    def __init__(self, nodes):
        self.head = None
        if nodes is not None:
            for elem in nodes:
                self.head = self.insert(self.head, elem) #1 Update the head
        print(self.head) #prints out None every time
        print(self.head.left)
        print(self.head.right)
        print(self.head.right.left)

    def insert(self, currentNode, data):
        if(currentNode == None):
            currentNode = Node(data)
        if(data != currentNode.data):
            if(data < currentNode.data): 
                if(currentNode.left is None): currentNode.left = Node(data)
                else: currentNode.left = self.insert(currentNode.left, data) #2 Update the left node
            elif(data > currentNode.data): 
                if(currentNode.right is None): currentNode.right = Node(data)
                else: currentNode.right = self.insert(currentNode.right, data) #3 Update the right node
        return currentNode #4 Return the currentNode

这是结果。

1  # head
0  # head.left
80 # head.right
3  # head.right.left

【讨论】: