当前位置: 首页 > 知识库问答 >
问题:

使用BST类和节点类在Python中实现二叉搜索树

魏成济
2023-03-14

谁能帮我弄清楚我做错了什么,所以我得到了这个输出错误-

当我测试程序是否插入树的第一个根时,插入函数工作正常,并且成功创建了第一个根,但一旦我将根分配给当前和while循环以搜索父项,然后在其上插入新值,我就会得到NameError:/

下面是我的代码使用python的实现:

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

class BST:
  def __init__(self):
      self.root = None
  
  def insert(self, value):
    if root is None:
      root == Node(value)
     
    current = root
    while(True):
      if(value < current.value):
        if current.left:
          current.left = Node(value)
          break
        current = current.left
      else:
        if current.right:
          current.right = Node(value)
          break
        current = current.right


if __name__ == '__main__':
  tree = BST()
  tree.insert(10)
  tree.insert(5)
  tree.insert(6)
  print("Tree Inserted Successfully")

谢谢你

我正在尝试在我的二叉搜索树中插入一个新值,因此有2种情况:

  • 如果BST为空(这很简单,传递正确)
  • 另一种情况是当我们必须找到此节点的父节点并插入其值时,我使用while(true)并将一个新的变量电流分配给root以在遍历树时跟踪当前父节点

共有1个答案

弓华茂
2023-03-14

问题:

>

  • root应该是self.root

    == 不是赋值。它应该是 =

    您应该在设置root后退出函数,而不是继续使用函数的其余部分:

    if self.root is None:
      self.root = Node(value) # Assign!
      return  # don't continue
    

    您在while循环中的if语句中的条件应该测试相反的条件。当您没有左孩子时,您应该在那里附加一个新节点,而不是当那里已经有一个节点时:

      if(value < current.value):
        if not current.left:  #  Opposite condition
          current.left = Node(value)
          break
        current = current.left
      else:
        if not current.right:  #  Opposite condition
          current.right = Node(value)
          break
        current = current.right
    

    所有代码:

    class Node:
      def __init__(self, value) :
          self.value = value
          self.left = None
          self.right = None
    
    class BST:
      def __init__(self):
          self.root = None
      
      def insert(self, value):
        if self.root is None:  # root is an attribute, not a variable
          self.root = Node(value)  # Assign!
          return # Don't continue
         
        current = self.root
        while(True):
          if(value < current.value):
            if not current.left:  #  Opposite condition
              current.left = Node(value)
              break
            current = current.left
          else:
            if not current.right:  #  Opposite condition
              current.right = Node(value)
              break
            current = current.right
    
    
    if __name__ == '__main__':
      tree = BST()
      tree.insert(10)
      tree.insert(5)
      tree.insert(6)
      print("Tree Inserted Successfully")
      print(tree.root.left.right.value)  # Should output: 6
    

  •  类似资料:
    • 这里有问题 二叉搜索树(BST)是一种二叉树,其中每个节点的值大于或等于该节点左子树中所有节点的值,而小于该节点右子树中所有节点的值。 编写一个函数,根据使用的时间有效地检查给定的二叉搜索树是否包含给定的值。

    • 编写一个函数,如果给定的二叉搜索树包含给定的值,则返回1,否则返回0。 例如,对于以下树: N1(值:1,左:null,右:null) n2(值:2,左:n1,右:n3) N3(值:3,左:null,右:null) 对contains(&n2,3)的调用应返回1,因为根位于n2的树包含编号3。 函数应该返回1,然而,它返回0或者根本不返回。

    • 二叉树 : 闲话少说,直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>BST</title> </head> <body> <script> //结点 function Node(data,left,right){ this.data=data; t

    • 问题内容: 我想在非二叉树中搜索一个项目(任何节点都可以有n个孩子)并立即退出递归。所讨论的节点可以是任何节点,而不仅仅是叶子。 这是我的代码,但我没有完整的搜索。 nNode包含: (是孩子) 和数据对象。 问题答案: 探索第一个孩子后,您不应该退出。您不需要循环前面的语句。

    • 当删除具有两个子节点的节点时,如果指示使用标准的二叉搜索树节点删除算法,我们应该将其替换为右子树的最小节点还是左子树的最大节点?