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
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)