簡體   English   中英

Python 3:二進制搜索樹無法設置節點

[英]Python 3: Binary Search Tree failed to set nodes

因此,我一直在從事實施二叉搜索樹的此類項目。 教授希望我們使私有遞歸同時使公眾變得簡單。 (就像何時插入元素(50)一樣,它調用私有函數recursive_insert(50,self .__ root)來解決)。

我的插入函數運行沒有錯誤,但是測試用例總是返回空,這是我的私有函數代碼:

class Binary_Search_Tree:


 class __BST_Node:

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

def __init__(self):
  self.__root = None
  self.__height=0
  self.__size=0

def _in_order_str(self, root):
  if root is None:
    outcome= "[ ]"
  elif self.__size==1:
    outcome = "[ " + str(root.value) + " ]"
  else:
    outcome = "[ "
    self._in_order_str(root.left)
    outcome += str(root.value) +", "
    self._in_order_str(root.right)
    outcome+= " ]"
  return outcome

def _recur_ins(self, val,root):
  if root is None:
    root=Binary_Search_Tree.__BST_Node(val)
  elif root.value>val:
    root.left = _recur_ins(val,root.left) #do I need self here?
  elif root.value <val:
    root.right = _recur_ins(val,root.right)
  return root

這是面向公眾的:

def insert_element(self, value):
  self._recur_ins(value,self.__root)
  self.__size+=1 

我的測試用例:

  def test_insertion_from_empty(self):
    root=None
    self.__bst.insert_element(50)
    self.__bst.insert_element(30)
    self.__bst.insert_element(70)
    self.assertEqual('[ 30, 50, 70 ]', self.__bst.in_order())

更新:我認為問題來自我的_in_order_str(self, root):方法。 我在網上發現的一般情況是:

def inorder(root):
    if root is not None:
        inorder(root.left)
        print root.key
        inorder(root.right)

我知道這可能是一個非常愚蠢的問題,但是我真的沒有自己一個人來解決。 任何幫助將不勝感激,非常感謝您!!!

在盡可能少地更改您的代碼之后,我想我已經設法使其正常工作。

from pprint import pprint  # For debugging

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

    def __init__(self):
        self.__root = None
        self.__height = 0
        self.__size = 0

    def __in_order_str(self, root):
        if root is None:
            outcome = "[ ]"
        elif self.__size == 1:
            outcome = "[ " + str(root.value) + " ]"
        else:
            outcome = "[ "
            self.__in_order_str(root.left)
            outcome += str(root.value) + ", "
            self.__in_order_str(root.right)
            outcome += " ]"
        return outcome

    def __recur_ins(self, val, root):
        if root is None:
            root = Binary_Search_Tree.__BST_Node(val)
        elif root.value > val:
            root.left = self.__recur_ins(val, root.left)
        elif root.value < val:
            root.right = self.__recur_ins(val, root.right)
        return root

    def insert_element(self, value):
        self.__root = self.__recur_ins(value, self.__root)
        self.__size += 1

    def test_insertion_from_empty(self):
        self.insert_element(50)
        self.insert_element(60)
        self.insert_element(70)
        # self.assertEqual('[ 30, 50, 70 ]', self.__bst.in_order())


test = Binary_Search_Tree()
test.test_insertion_from_empty()
pprint(vars(test))

更改說明:

  • 將某些函數(_recur_ins,_in_order_str)從使用“ _”更改為“ __”以使其成為私有函數。 我是基於Python官方文檔編寫的 ,私有函數至少使用兩個下划線,最多使用一個下划線。

  • 在insert_element的第一行中,添加了'self .__ root =',以便將返回的根值存儲為新的根

  • 添加了“自我”。 就'__recur_ins'而言,因為據我所知,每當需要調用位於同一類的函數時,都必須使用self。
  • 我沒有對__in_order_str進行任何修改,因為我認為作者只要求插入(?)
  • 評論了assertEqual,因為問題(?)中沒有提供任何功能
  • 修改了空格,使其更具可讀性

如果在轉儲變量之前將調試模式設置為正確,這就是我得到的: 調試結果

我認為應該是正確的。 首先插入50,因此將其用作根,然后將60插入50的右子元素上,然后將70插入60的右子元素上。

注意:我也是新手,請告訴我我犯的任何錯誤,我將予以糾正:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM