treenode_t* inorder_successor(treenode_t *treenode, char *name){ treenode_t *current = find_node(treenode, name); if (current == NULL){ return NULL; } //case 1: node has right subtree// if ((current->right) != NULL){ return minimum_Node(current->right); } // case 2: no right subtree // else { treenode_t *successor = NULL; treenode_t *ancestor = treenode; while(ancestor != current){ if (strcmp ((itemname(current->item)), (itemname(ancestor->item))) < 0){ successor = ancestor; ancestor = ancestor->left; } else ancestor = ancestor->right; } return successor; } }
treenode_t* find_node(treenode_t *treenode, char *name){ if(treenode == NULL){ return NULL; } else if (strcmp(name, itemname(treenode->item)) == 0){ return treenode; } else if(strcmp(name, itemname(treenode->item)) > 0){ return find_node(treenode->right, name); } else{ return find_node(treenode->left, name); } }
bool ExpressionItem::setTimeValue(const char * time_str) { this->type=const_type; this->return_type=t_time; this->_time=*(time_duration*)time_str; string itemname(time_str); this->item_name=itemname; return true; }
treenode_t* tree_insert(treenode_t **treenode, item_t *item){ if (treenode == NULL){ (*treenode) = create_treenode(item); return 0; // Not sure it should return 0.. //(just so it compiles for now) } else if(strcmp(itemname(item), itemname((*treenode)->item)) < 0) (*treenode)->left= tree_insert(&(*treenode)->left , item); else if(strcmp(itemname(item), itemname((*treenode)->item)) == 0) (*treenode)->left= tree_insert(&(*treenode)->left , item); else (*treenode)->right = tree_insert(&(*treenode)->right, item); return *treenode; }
bool ExpressionItem::setIntValue(const char* int_str) { this->type=const_type; this->return_type=t_int; this->content.data.value._int=atoi(int_str); string itemname(int_str); this->item_name=itemname; return true; }
bool ExpressionItem::setDatetimeValue(const char * datetime_str) { this->type=const_type; this->return_type=t_datetime; this->_datetime=*(ptime*)datetime_str; string itemname(datetime_str); this->item_name=itemname; return true; }
bool ExpressionItem::setULongValue(const char* u_long_str) { this->type=const_type; this->return_type=t_u_long; this->content.data.value._ulong=atol(u_long_str); string itemname(u_long_str); this->item_name=itemname; return true; }
bool ExpressionItem::setDoubleValue(const char* double_str) { this->type=const_type; this->return_type=t_double; this->content.data.value._double=atof(double_str); string itemname(double_str); this->item_name=itemname; return true; }
bool ExpressionItem::setFloatValue(const char* float_str) { this->type=const_type; this->return_type=t_float; this->content.data.value._float=atof(float_str); string itemname(float_str); this->item_name=itemname; return true; }
void ordered_print(treenode_t *treenode){ if(treenode == NULL){ puts("No more items to print"); return; } ordered_print(treenode->left); printf("%s", itemname(treenode->item)); ordered_print(treenode->right); }
bool ExpressionItem::setDecimalValue(const char * decimal_str) { this->type=const_type; this->return_type=t_decimal; NValue nvalue=*(NValue*)decimal_str; this->_decimal=nvalue; string itemname(decimal_str); this->item_name=itemname; return true; }
treenode_t* tree_remove(treenode_t **treenode, char *name){ if (*treenode == NULL){ return *treenode; } if(strcmp(name, itemname((*treenode)->item)) < 0){ (*treenode)->left = tree_remove(&(*treenode)->left, name); } if (strcmp(name, itemname((*treenode)->item)) > 0){ (*treenode)->right = tree_remove(&(*treenode)->right, name); } else if ((*treenode)->left == NULL && (*treenode)->right == NULL){ free(treenode); } /// Node has 1 child (right) else if ((*treenode)->left == NULL) { treenode_t *temp = (*treenode)->right; free(*treenode); return temp; } /// Node has 1 child (left) else if ((*treenode)->right == NULL){ treenode_t*temp = (*treenode) ->left; free(*treenode); return temp; } // Find inorder successor treenode_t *temp = inorder_successor((*treenode)->right, name); //store inorder successor in node (*treenode)->item = temp->item; //delete the inorder successor (*treenode)->right = tree_remove(&(*treenode)->right, itemname(temp->item)); return *treenode; }