예제 #1
0
 def add(self, data):
     #Tree is empty
     if self.size == 0:
         self.head = AbstractNode(data)
         self.size += 1
     else:
         curr_node = self.head
         #assert isinstance(curr_node, AbstractNode)
         while True:
             #Right branch of current
             if data > curr_node.get_data():
                 if curr_node.get_right() is None:
                     #Insert new node with data as the right child
                     curr_node.set_right(AbstractNode(data))
                     self.size += 1
                     break
                 else:
                     curr_node = curr_node.get_right()
             #Left branch of current
             elif data < curr_node.get_data():
                 if curr_node.get_left() is None:
                     #Insert new node with data as the left child
                     curr_node.set_left(AbstractNode(data))
                     self.size += 1
                     break
                 else:
                     curr_node = curr_node.get_left()
             else:
                 curr_node.increment()
                 self.size += 1
                 break
예제 #2
0
    def add_node(self, data, index=0):
        """
        This method adds a new node either at the end or at the specified index counting from the front of the list
        :param data:
        :param index:
        """
        #List is empty
        if self.size == 0:
            self.head = AbstractNode(data)
            self.tail = self.head
            self.head.set_prev(self.tail)
            self.size += 1

        #Default parameters (end of list)
        elif index == 0:
            new_node = AbstractNode(data)
            self.tail.set_next(new_node)
            old_tail = self.tail
            self.tail = self.tail.get_next()
            self.tail.set_prev(old_tail)
            self.size += 1

        #Non-default parameters (anywhere in list)
        elif 0 < index < self.size:
            node = self.head
            for i in range(index):
                node = node.get_next()
            #Add the new node into the list
            prev_node = node.get_prev()
            new_node = AbstractNode(data)
            prev_node.set_next(new_node)
            new_node.set_prev(prev_node)
            #Link the new node to the old node
            prev_node = prev_node.get_next()
            prev_node.set_next(node)
            node.set_prev(prev_node)
            self.size += 1

        #Error if no case satisfied
        else:
            print("Invalid argument: add ", index)