繁体   English   中英

二进制搜索树不插入/打印实际最大值,除非它以root身份实现

[英]Binary search tree not inserting/printing actual largest value unless it is implemented as root

我现在正在学习二叉搜索树,自己做了一个。 我的树的问题是traverse()方法不打印最大值(下面粘贴的代码中的'15'),除非它是要插入的第一个值。

我也尝试了getMaxValue()函数,它也没有返回预期值,而是给出第二大值。 这导致我认为问题必须在某个地方的insert()函数中,但它已经是一个小时,我找不到修复或我做错了什么。

class Node(object):

  def __init__(self,data):
    self.data = data
    self.leftChild = None
    self.rightChild = None


class BinarySearchTree(object):

  def __init__(self):
    self.root = None

  #Parent function of insert
  def insert(self,data):
    if not self.root:
      self.root = Node(data)
    else:
      self.insertNode(data,self.root)

  # O(log n) if the tree is balanced!!!! 
  # thats why AVL and RBT are needed!
  #Child function of insert
  def insertNode(self,data,node):

    if data < node.data:
      # check if there is already a left child, if it is not null then we call insertNode recursively and insert a node as its child
      if node.leftChild:
        self.insertNode(data,node.leftChild)
        # if there is no left child then we instantiate it, and make a left child, same stuff happening for right child 
      else:
        node.leftChild = Node(data)
    else:
      if node.rightChild:
        self.insertNode(data, node.rightChild)
      else:
        self.rightChild = Node(data)

#Parent function of getminvalue
  def getMinValue(self):
    if self.root:
      return self.getMin(self.root)

#Child function of getminvalue
  def getMin(self,node):
  #if there is a left child
    if node.leftChild:
      #go to left child recursively
      return self.getMin(node.leftChild)

    return node.data

#Parent function of getMaxValue  
  def getMaxValue(self):
    if self.root:
      return self.getMax(self.root)

#Child function of getmaxValue
  def getMax(self, node):

    if node.rightChild:
      return self.getMax(node.rightChild)

    return node.data 

#Parent function of traverse
  def traverse(self):
    if self.root:
      self.traverseInOrder(self.root)

#Child function of traverseinOrder  
  def traverseInOrder(self,node):

    if node.leftChild:
      self.traverseInOrder(node.leftChild)

    print("%s " % node.data)

    if node.rightChild:
      self.traverseInOrder(node.rightChild)


#Inputs
bst = BinarySearchTree()

bst.insert(10)
bst.insert(15)
bst.insert(5)
bst.insert(4)
bst.insert(3)

print(bst.traverse())

预期的结果是

3
4
5
10
15

但我得到了

3
4
5
10 
None

固定:

将很快编辑详细信息

class Node(object):

  def __init__(self,data):
    self.data = data
    self.leftChild = None
    self.rightChild = None


class BinarySearchTree(object):

  def __init__(self):
    self.root = None

  #Parent function of insert
  def insert(self,data):
    if not self.root:
      self.root = Node(data)
    else:
      self.insertNode(data,self.root)

  # O(log n) if the tree is balanced!!!!
  # thats why AVL and RBT are needed!
  #Child function of insert
  def insertNode(self,data,node):

    if data < node.data:
      # check if there is already a left child, if it is not null then we call insertNode recursively and insert a node as its child
      if node.leftChild:
        self.insertNode(data,node.leftChild)
        # if there is no left child then we instantiate it, and make a left child, same stuff happening for right child
      else:
        node.leftChild = Node(data)
    else:
      if node.rightChild:
        self.insertNode(data, node.rightChild)
      else:
        node.rightChild = Node(data)

#Parent function of getminvalue
  def getMinValue(self):
    if self.root:
      return self.getMin(self.root)

#Child function of getminvalue
  def getMin(self,node):
  #if there is a left child
    if node.leftChild:
      #go to left child recursively
      return self.getMin(node.leftChild)

    return node.data

#Parent function of getMaxValue
  def getMaxValue(self):
    if self.root:
      return self.getMax(self.root)

#Child function of getmaxValue
  def getMax(self, node):

    if node.rightChild:
      return self.getMax(node.rightChild)

    return node.data

#Parent function of traverse
  def traverse(self):
    if self.root:
      self.traverseInOrder(self.root)

#Child function of traverseinOrder
  def traverseInOrder(self,node):

    if node.leftChild:
      self.traverseInOrder(node.leftChild)

    print("%s " % node.data)

    if node.rightChild:
      self.traverseInOrder(node.rightChild)


#Inputs
bst = BinarySearchTree()

bst.insert(10)
bst.insert(15)
bst.insert(5)
bst.insert(4)
bst.insert(3)

bst.traverse()

我使用调试器(我建议你这样做,它非常有用)逐步完成代码,并看到了这个:

调试器

正如您所看到的,具有数据10 node没有正确的子node ,而self具有带数据10root和带有数据15 rightChild

这让我看到插入一个新的右子的行,你错误地写了: self.rightChild = Node(data)而不是node.rightChild = Node(data) (就像你正确对待左子)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM