TreeNode *build_sub_tree(vector<int> &preorder, int pre_start, int pre_end, vector<int> &inorder, int in_start, int in_end) { if (pre_start > pre_end) return NULL; int root_val = preorder[pre_start], root_index_inorder = in_start; while (inorder[root_index_inorder] != root_val) {root_index_inorder++;} int left_tree_end_preorder = pre_start + (root_index_inorder - in_start); TreeNode *root = new TreeNode(root_val); root->left = build_sub_tree(preorder, pre_start + 1, left_tree_end_preorder, inorder, in_start, root_index_inorder - 1); root->right = build_sub_tree(preorder, left_tree_end_preorder + 1, pre_end, inorder, root_index_inorder + 1, in_end); return root; }
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) { return build_sub_tree(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1); }
void conditional_parrern_base(struct node *fptree, struct header_table *htable, int *item_counter,int *item_index, char *generate_string) { struct frequent_patterns *fp = malloc(sizeof(struct frequent_patterns)); struct frequent_patterns *fp_head = malloc(sizeof(struct frequent_patterns)); struct node *now_node = malloc(sizeof(struct node)); int ptr_index; fp_head = fp; if(generate_string != "") //printf("%s \n", generate_string); while(htable != NULL) { fp = fp_head; fp->next = NULL; fp->index = 0; listStart(htable->cond); while(listNext(htable->cond)) { now_node = listGet(htable->cond); if(fp->index == 0) { fp->ptr = malloc(sizeof(short) * MIN_SUPPORT_INDEX); } else { struct frequent_patterns *new_fp = malloc(sizeof(struct frequent_patterns)); new_fp->ptr = malloc(sizeof(short) * MIN_SUPPORT_INDEX); fp->next = new_fp; fp = new_fp; } fp->counter = now_node->counter; fp->htable_value = htable->no; ptr_index = 0; now_node = now_node->parent; while(now_node != NULL) { if( now_node->no == -1) break; *(fp->ptr + ptr_index) = now_node->no; ptr_index++; now_node = now_node->parent; } fp->index = ptr_index; } struct header_table *sub_htable = malloc(sizeof(struct header_table)); struct node *sub_tree = malloc(sizeof(struct node)); sub_tree = create_fptree(); sub_tree = build_sub_tree(sub_tree, sub_htable, fp_head, item_counter, item_index); //dfs(sub_tree); if(sub_tree->child != NULL) { int len = strlen(generate_string) + 4; char *str_ans = malloc(sizeof(char) * len); myString_cat(str_ans, generate_string, htable->no); while(sub_htable->next != NULL) sub_htable = sub_htable->next; conditional_parrern_base(sub_tree, sub_htable, item_counter, item_index, str_ans); dfs(sub_tree); }else if(htable->prev == NULL || listCount(htable->cond) > 0){ int len = strlen(generate_string) + 4; char *str_ans = malloc(sizeof(char) * len); myString_cat(str_ans, generate_string, htable->no); //printf("%s\n", str_ans); } htable = htable->prev; } while(htable != NULL) { header_head = htable; htable = htable->next; free(header_head); } }