简体   繁体   English

在python中实现二叉搜索树?

[英]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提供了两个选项

  1. Adds a helper function for insert to Tree (similar to helper print function __print).添加用于插入到 Tree 的辅助函数(类似于辅助打印函数 __print)。 This allows keeping track of node we are traversing in the tree这允许跟踪我们在树中遍历的节点
  2. Non-recursive insert which processes through nodes.通过节点处理的非递归插入。

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.

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