【问题标题】:Binary Search Tree insertion in Python not returning to consolePython中的二叉搜索树插入不返回控制台
【发布时间】:2018-09-02 06:27:51
【问题描述】:

在hackerrank中学习BST时,我遇到了以下问题。

我的节点和二叉搜索树的类定义如下:

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

class BinarySearchTree:
    def __init__(self):
        self.root = None

    def insert(self,val):
        currentNode = self.root
        if currentNode is None:
            self.root = Node(val)
        elif currentNode.info > val:
            currentNode.left = insert(currentNode.left,val)
        elif currentNode.info < val:
            currentNode.right = insert(currentNode.right,val)
        return currentNode

但是,在对某些整数数组 arr 使用 tree.insert(arr[i] 的 for 循环之后,对 tree = BinarySearchTree() 执行遍历不会返回任何输出。这个逻辑对我来说似乎是正确的,我怀疑这是由于 Node 和 BST 之间的类型不同,但我不确定如何解决这个问题。

编辑:下面是来自hackerrank的完整代码。我唯一能编辑的是插入功能。

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

    def __str__(self):
        return str(self.info) 

def preOrder(root):
    if root == None:
        return
    print (root.info, end=" ")
    preOrder(root.left)
    preOrder(root.right)
    
class BinarySearchTree:
    def __init__(self): 
        self.root = None

    def insert(self,val):
        currentNode = self.root
        if currentNode is None:
            self.root = Node(val)
        elif currentNode.info > val:
            currentNode.left = insert(currentNode.left,val)
        elif currentNode.info < val:
            currentNode.right = insert(currentNode.right,val)
        return currentNode

tree = BinarySearchTree()
t = int(input())

arr = list(map(int, input().split()))

for i in range(t):
    tree.insert(arr[i])

preOrder(tree.root)

给定的测试用例是

6
4 2 3 1 7 6

应该返回4 2 3 1 7 6,但没有返回任何输出。

编辑:根据第一个答案进行更改!现在,我有以下一周的错误:

Traceback (most recent call last):
    File “solution.py”, line 40, in <module>
        tree.insert(arr[i])
    File “solution.py”, line 30, in insert
        currentNode.left = insert(currentNode.left,val)
NameError: name ‘insert’ is not defined

【问题讨论】:

  • 您能否也发布您的测试用例和您的预期结果?
  • @jshamble 好吧!

标签: python python-3.x insert binary-tree binary-search-tree


【解决方案1】:

将您的代码更改为

    def insert(self, val, currentNode):

        if self.root is None:
            self.root = Node(val)

        elif currentNode.info > val:
            if currentNode.left is None
                currentNode.left = Node(val)
            else:
                self.insert(val, currentNode.left)

        elif currentNode.info < val:

            if currentNode.right is None
                currentNode.right = Node(val)
            else:
                self.insert(val, currentNode.right)

并通过调用它

 tree.insert(val,tree.root)

【讨论】:

  • 谢谢!我的原始代码还有哪些其他问题? :)
  • 如果它有效,请支持答案:) 有一些逻辑问题,以及您尝试调用插入函数,而不使用self.function()
  • 我已接受它作为答案,但遗憾的是,我没有公开投票所需的声誉:(请问为什么需要附加条件?如果我到达子节点,如果条件在那里插入 Node(val),self.root 不会吗?
  • 首先的问题是你有以下代码elif currentNode.info &gt; val: currentNode.left = insert(currentNode.left,val) 你没有接受节点的函数,你只有接受 val 参数的插入函数,所以这是一个语法错误,其次,函数的第一行是currentNode = self.root,如果您要传递 currentNode 参数,则再次将其默认为 self.root,因此它将始终卡在无限循环中,这是语义错误: )
  • 你好,现在我得到名字'self'没有在def insert()的行中定义,有没有办法解决这个问题?
【解决方案2】:

我认为问题出在这里

def insert(self,val):
    currentNode = self.root
    if currentNode is None:
        currentNode = Node(val)
    elif currentNode.info > val:
        currentNode.left = insert(currentNode.left,val)
    elif currentNode.info < val:
        currentNode.right = insert(currentNode.right,val)
    return currentNode

如您所见,您“插入”了节点,但没有分配它,代码块

if currentNode is None:
    currentNode = Node(val) 

应该是

if currentNode is None:
    self.root = Node(val)

你继续尝试遍历 Null 树

编辑:这可能不是问题,请提供您的代码中缺少 create() 函数但被调用的完整代码

【讨论】:

  • 您好,create 是一个错字,应该插入!
  • 在这种情况下,这就是问题所在,当根为空时创建一个节点但不要将其存储在任何地方,这应该可以解决问题:)
  • 你好,编辑后,现在我得到 NameError: name ‘insert’ is not defined :(
  • 根据您的回答编辑!
  • 能否请您也发布错误?它到底在哪里给出了那个错误,等等。
【解决方案3】:

这是一个略短的版本,它避免了嵌套的“if”语句并且没有“Node”类:

class BinarySearchTree:
    def __init__(self):
        self.info = None
        self.left = None
        self.right = None

    def insert(self,val):
        if self.info is None:
            self.info = val
            self.left = BinarySearchTree()
            self.right = BinarySearchTree()
        elif self.info > val:
            self.left.insert(val)
        elif self.info < val:
            self.right.insert(val)

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多