[英]Implementing Binary search tree in python?
I am trying to do insert function in python for BST but I am just confused on how to access the public methods properly and its giving me some grief, right now when I test it it just stops at the first test and says nonetype object has no attribute data but how am I suppose to access data when t = tree() and tree doesn't have a data constructor?我正在尝试在 python 中为 BST 做插入函数,但我只是对如何正确访问公共方法感到困惑,这让我有些难过,现在当我测试它时,它只是在第一次测试时停止并说 nonetype 对象没有属性数据,但是当 t = tree() 和 tree 没有数据构造函数时,我应该如何访问数据?
class Node(object):
def __init__(self, data):
self.parent = None
self.left = None
self.right = None
self.data = data
class Tree(object):
# Binary Search Tree
# class constants
PREORDER = 1
INORDER = 2
POSTORDER = 3
def __init__(self):
# Do not create any other private variables.
# You may create more helper methods as needed.
self.root = None
def print(self):
# Print the data of all nodes in order
self.__print(self.root)
def __print(self, curr_node):
# Recursively print a subtree (in order), rooted at curr_node
if curr_node is not None:
self.__print(curr_node.left)
print(str(curr_node.data), end=' ') # save space
self.__print(curr_node.right)
def insert(self, data):
# Find the right spot in the tree for the new node
# Make sure to check if anything is in the tree
# Hint: if a node n is null, calling n.getData() will cause an error
root = Node(data)
print("this is my", self.root)
if self.root is None:
self.root = root
return Node(data)
else:
if root.data == data:
return root
elif root.data < data:
root.right = insert(root.right,data)
else:
root.left = insert(root.left, data)
return root
And this is the test cases that I'm running with这是我正在运行的测试用例
import lab3
import unittest
class T0_tree__insert(unittest.TestCase):
def test_balanced_binary_search_tree(self):
print("\n")
print("tree_insert_with_individual_check")
t = lab3.Tree()
t.insert(4)
t.insert(2)
t.insert(6)
t.insert(1)
t.insert(3)
t.insert(5)
t.insert(7)
#The following check is without using tree as an iterator (which uses inorder traversal)
#So this function also does not check the implementation of the traversal function
self.assertEqual(t.root.data, 4)
self.assertEqual(t.root.left.data, 2)
self.assertEqual(t.root.left.left.data, 1)
self.assertEqual(t.root.left.right.data, 3)
self.assertEqual(t.root.right.data, 6)
self.assertEqual(t.root.right.left.data, 5)
self.assertEqual(t.root.right.right.data, 7)
print("\n")
Provided two options提供了两个选项
Both options satisfy unittest.这两个选项都满足单元测试。
Option 1 - Add a utility function to insert选项 1 - 添加要插入的实用程序函数
File labe3.py文件 label3.py
class Node(object):
def __init__(self, data):
self.parent = None
self.left = None
self.right = None
self.data = data
class Tree(object):
# Binary Search Tree
# class constants
PREORDER = 1
INORDER = 2
POSTORDER = 3
def __init__(self):
# Do not create any other private variables.
# You may create more helper methods as needed.
self.root = None
def print(self):
# Print the data of all nodes in order
self.__print(self.root)
def __print(self, curr_node):
# Recursively print a subtree (in order), rooted at curr_node
if curr_node is not None:
self.__print(curr_node.left)
print(str(curr_node.data), end=' ') # save space
self.__print(curr_node.right)
def insert(self, d):
print("this is my", self.root)
if self.root is None:
self.root = Node(d)
else:
self._insert(self.root, d) # here's the call to a "private" function to which we are passing nodes down, starting from root
def _insert(self, node, value):
''' helper function for insert
node - node in BST to add value
value - value to add
'''
if value < node.data: # we know that `node` cannot be None
# so it's safe to check its value!
if node.left:
self._insert(node.left, value) # the recursive call is done only when `node.left` is not None
else:
node.left = Node(value) # direct assignment
else:
if node.right:
self._insert(node.right, value)
else:
node.right = Node(value) # direct assignment
Option 2-non-recursive insert function选项 2-非递归插入函数
File labe3.py文件 label3.py
class Node(object):
def __init__(self, data):
self.parent = None
self.left = None
self.right = None
self.data = data
class Tree(object):
# Binary Search Tree
# class constants
PREORDER = 1
INORDER = 2
POSTORDER = 3
def __init__(self):
# Do not create any other private variables.
# You may create more helper methods as needed.
self.root = None
def print(self):
# Print the data of all nodes in order
self.__print(self.root)
def __print(self, curr_node):
# Recursively print a subtree (in order), rooted at curr_node
if curr_node is not None:
self.__print(curr_node.left)
print(str(curr_node.data), end=' ') # save space
self.__print(curr_node.right)
def insert(self, d):
print("this is my", self.root)
if self.root is None:
self.root = Node(d)
else:
# current node
current = self.root
# Finds node to add data
while True:
if current.data > d:
if current.left == None:
current.left = Node(d)
break
else:
current = current.left
elif current.data < d:
if current.right == None:
current.right = Node(d)
break
else:
current = current.right
else:
break
File main.py文件main.py
import lab3
import unittest
class T0_tree__insert(unittest.TestCase):
def test_balanced_binary_search_tree(self):
print("\n")
print("tree_insert_with_individual_check")
t = lab3.Tree()
t.insert(4)
t.insert(2)
t.insert(6)
t.insert(1)
t.insert(3)
t.insert(5)
t.insert(7)
#The following check is without using tree as an iterator (which uses inorder traversal)
#So this function also does not check the implementation of the traversal function
self.assertEqual(t.root.data, 4)
self.assertEqual(t.root.left.data, 2)
self.assertEqual(t.root.left.left.data, 1)
self.assertEqual(t.root.left.right.data, 3)
self.assertEqual(t.root.right.data, 6)
self.assertEqual(t.root.right.left.data, 5)
self.assertEqual(t.root.right.right.data, 7)
print("\n")
if __name__ == '__main__':
unittest.main()
Output输出
tree_insert_with_individual_check
this is my None
this is my <lab3.Node object at 0x7fa4386b92e0>
this is my <lab3.Node object at 0x7fa4386b92e0>
this is my <lab3.Node object at 0x7fa4386b92e0>
this is my <lab3.Node object at 0x7fa4386b92e0>
this is my <lab3.Node object at 0x7fa4386b92e0>
this is my <lab3.Node object at 0x7fa4386b92e0>
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.